2017-10-19 86 views
0

我必須在對象中使兩個密鑰可選indexremove。但是,如果提供了另一個必須在那裏。所以它是這樣的:可選組密鑰

type Props = { 
    isSettings: boolean, 
} | { 
    index: number, 
    remove: $PropertyType<FieldProps, 'remove'> // (index: number) => void 
} 

其中第二個對象是可選的。以上不起作用,因爲它不會在第3個對象中出現isSettings。但它始終是必需的。

回答

1

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

+0

非常感謝您提供如此深入的解決方案!太快了! – Noitidart

+0

我其實需要這樣做:'{| ... FieldProps,isSettings:boolean,|} | {|'裏面的對象有一個擴展,它不斷被突出顯示爲不兼容。是否有可能使傳播確切嗎?我應該爲此發佈另一個問題嗎? – Noitidart

+1

可能是最好做另一個問題。我不知道我的頭頂,但我確實認爲這些功能在涉及傳播時有一點點缺陷。 – loganfsmyth