Flowtype中的標準對象類型是定義爲具有至少指定的屬性的對象。這意味着如果您的類型爲{ isSettings: boolean }
,那麼您只是表示該對象具有一個布爾型的isSettings
屬性。它允許有其他屬性,它只需要知道isSettings
的類型。
這意味着,如果你有一個類型
type Props = {
isSettings: boolean,
} | {
index: number,
remove: (index: number) => void
};
然後做
var obj: Props = ...
if (obj.remove) {
var n: number = obj.index;
}
會失敗,因爲它並不能證明什麼,因爲你沒有禁止有是一個remove
兩個對象的屬性。
爲了細化像這樣的對象類型,Flow需要被告知每個類型都有,正好是給定的一組屬性。這是流動的Exact object types進來了。
如果你改變你的類型是
type Props = {|
isSettings: boolean,
|} | {|
index: number,
remove: (index: number) => void
|};
則如預期一樣
var obj: Props = ...
if (obj.remove) {
var n: number = obj.index;
}
片段會的工作,因爲remove
存在意味着有必須屬於index
這是一個number
。
非常感謝您提供如此深入的解決方案!太快了! – Noitidart
我其實需要這樣做:'{| ... FieldProps,isSettings:boolean,|} | {|'裏面的對象有一個擴展,它不斷被突出顯示爲不兼容。是否有可能使傳播確切嗎?我應該爲此發佈另一個問題嗎? – Noitidart
可能是最好做另一個問題。我不知道我的頭頂,但我確實認爲這些功能在涉及傳播時有一點點缺陷。 – loganfsmyth