2017-07-27 69 views
0

如果我用這樣的陣列中的流量協財產

type T0 = {p0: string, +p1?: string}; 
type T1 = {p0: string, p1: string}; 

function F0(a: T0) {} 
function F1(a: T1) { 
    F0(a); 
} 

flow try

一切正常:T0.p1是協變的和沒有錯誤的存在。

但是。如果我需要爲參數的類型

type T0 = {p0: string, +p1?: string}; 
type T1 = {p0: string, p1: string}; 

function F0(a: T0[]) {} 
function F1(a: T1[]) { 
    F0(a); 
} 

flow try

數組這抱怨的「協變物業p1與不變的使用不兼容」。 而且我不知道爲什麼會發生

+0

爲什麼不在這裏添加js? – Sagar

+0

Sagar,我做到了,對不起 –

+0

有趣的是,考慮到'F1'可以帶'T1',並且您可以通過'F0([a])',它使得參數'T1 []'不會產生錯誤。 – MinusFour

回答

1

使用這種類型的簽名就不會有什麼能夠阻止你做

function F0(a: T0[]) { 
    a.push({ p0: "" }); 
} 

這在F1類型簽名的F0類型簽名有效,但無效。

這給你留下了兩個選擇。

使用協變數組類型$ReadOnlyArray,所以流量知道你會不會將項目添加到數組:

type T0 = {p0: string, +p1?: string}; 
type T1 = {p0: string, p1: string}; 

function F0(a: $ReadOnlyArray<T0>) {} 
function F1(a: T1[]) { 
    F0(a); 
} 

讓從F1類型流經到F0與通用,所以流量知道實際對象的類型。

type T0 = {p0: string, +p1?: string}; 
type T1 = {p0: string, p1: string}; 

function F0<T: T0>(a: Array<T>) {} 
function F1(a: T1[]) { 
    F0(a); 
}