2017-08-03 63 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