2017-10-04 29 views
1

您可以在flow.org/try查看代碼,或者你可以看它在這裏:流量甚至類型細化後抱怨未定義

/* @flow */ 

type Thing = { 
    arr?: Array<number> 
} 

const thing: Thing = { 
    arr: [10, 20, 30] 
} 

function getSubArray(thing: Thing, index: number) { 
    if (!thing.arr) return [] 

    return [ 
    ...thing.arr.slice(0, index), 
    ...thing.arr.slice(index + 1) 
    ] 
} 

const newArr = getSubArray(thing, 1) 

我認爲做if (!thing.arr) return [],將作爲「類型精化」和流理解thing.arr之後不是undefined。然而,它給我一個錯誤說

16:  ...thing.arr.slice(index + 1)   
     ^call of method `slice`. Method cannot be called on possibly undefined value 
16:  ...thing.arr.slice(index + 1) 
     ^undefined 

任何幫助,將不勝感激!

+0

當您刪除數組文本中的第二個傳播操作時,它會輸入檢查。我想這個第一次操作無論如何都會使優化無效。在所有情況下,使用Javascript正確推斷類型可能很難或不可能,因爲副作用可以在任何地方逐字執行。 – ftor

+0

是的,我也注意到了。你認爲解決這個問題的唯一方法是使用[類型轉換](https://flow.org/en/docs/types/casting/)? – saadq

回答

1

第一次致電arr.slice「可能」變異thing.arr變爲undefined,使得第二次調用slice出現錯誤。流程通過使細化無效來保護您免受這種可能性的影響。

您可以將thing.arr存儲在const中,然後使用它(在所有三個位置)來避免潛在的錯誤。

+0

但是'slice'是內置的,不會改變任何東西。不應該流動知道行爲不可變的內置函數嗎? – ftor

+0

請參閱https://github.com/facebook/flow/issues/4941 https://github.com/facebook/flow/issues/4458 https://github.com/facebook/flow/issues/3059 https:/ /github.com/facebook/flow/issues/2986 https://github.com/facebook/flow/issues/2728等 –

+0

唉,這是很多需要閱讀的。所有這些問題歸結爲_Flow只能做到這一點,而不會變成運行時引擎_。 – ftor

相關問題