2017-07-27 64 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); 
}