2017-08-03 53 views
0

首先,如果我的措辞不正确,请原谅我,我不太熟悉所有的打字行话。Flowtype:Extend数组类型参数

我有两种类型:AB,其中BA的延伸,就像这样:

type A = { a: string }; 
type B = { a: string, b: string }; 

他断言B类型的值符合输入A正常工作:

const bar: B = { a: 'hello', b: 'world' }; 
(bar: A); // No problemo 

但是,当将值包装到数组中时,断言变差:

const bars: Array<B> = [bar]; // This is fine 
(bars: Array<B>); // Also fine 
(bars: Array<A>); // Breaks!! 

我完全误解了一些东西吗?这是一个泛型问题,一个数组问题,或只是一个错误在流?

流量版本:v0.52.0

检查出来自己在Flow

+0

您对此有何看法? type A = {a:string,b ?: string}; type B = {a:string,b ?: string}; –

+0

@MarkoSavic我不想改变类型A来解决这个问题。 – Edo

回答

3

这是因为在Array<T>类型参数T是invariant--意味着考虑子类型关系时,不接受超类型或亚型。看看这里的差异文档以获取更多信息:https://flow.org/en/docs/lang/variance/#toc-invariance

你在找什么是一个带有协变类型参数的数据结构。具体而言,您可能需要使用$ReadOnlyArray<T>

Try it

+0

谢谢!不知道$ ReadOnlyArray ,我想我只会从现在开始使用那个:D – Edo

+0

没问题! ReadOnlyArray不会让你改变它,但。在任何情况下它都可能不会有用。 –

+0

我意识到这一点,并且我爱不变:p。会有例外,但从现在开始,ReadOnlyArray将成为我的继续。 – Edo