2017-07-30 64 views
0

爲什麼會發生此錯誤?如果我對單個對象(而不是數組)執行相同的操作,它將起作用。FlowJs - 從陣列<Concrete>轉換爲陣列時出錯<Generic>

problem

編輯 OK,這裏是文字與額外的測試。

//@flow 
type Generic = { 
    id: number, 
} 

type Concrete = { 
    id: number, 
    a: number, 
} 

//------test 1----------- 

function f(array: Array<Generic>) { } 

//'property `a` (Property not found in object type See also: function call)' 
var array: Array<Concrete> = [{ id: 1, a: 2 }] 
f(array) 

//------test 2------------ 
var a:Generic = { id: 1 } 
var b:Concrete = { id: 2, a: 3 } 

//OK 
a = b 
+0

請將截圖中的代碼記錄爲文本,以便將其複製並試用。 –

+0

@PavelZubkou請參閱帖子編輯 – eugenekr

回答

1

數組在JavaScript中是可變的,Flow承認這一事實。

得出了一個array參數的Array<Generic>約束f,你可能會推Generic類型的對象爲array說法從內f。這會改變被全局變量array引用的數組對象,其定義爲Array<Concrete>。因此未能同時滿足這兩個約束條件。

這取決於你的任務,但如果array參數的值不應該被改變,你可以輸入它作爲array: $ReadOnlyArray<Generic>。這將允許您通過Array<Concrete>作爲參數而沒有衝突,因爲$ReadOnlyArray是一種不允許在數組上進行變異操作的類型。