我必须在对象中创建两个键可选index
和remove
。但是,如果提供一个,则另一个必须在那里。所以它是这样的:
type Props = {
isSettings: boolean,
} | {
index: number,
remove: $PropertyType<FieldProps, 'remove'> // (index: number) => void
}
第二个对象是可选的。以上操作无效,因为它不期望第3个对象中的isSettings
。但它始终是必需的。
答案 0 :(得分: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每个类型完全给定的属性集。这就是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
的{{1}}属性。