可选的一组键

时间:2017-10-19 00:25:21

标签: flowtype

我必须在对象中创建两个键可选indexremove。但是,如果提供一个,则另一个必须在那里。所以它是这样的:

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

第二个对象是可选的。以上操作无效,因为它不期望第3个对象中的isSettings。但它始终是必需的。

1 个答案:

答案 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}}属性。