Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flowtype 可选密钥组_Flowtype - Fatal编程技术网

Flowtype 可选密钥组

Flowtype 可选密钥组,flowtype,Flowtype,我必须在对象中设置两个可选键index和remove。但是,如果提供一个,另一个必须在那里。所以它是这样的: type Props = { isSettings: boolean, } | { index: number, remove: $PropertyType<FieldProps, 'remove'> // (index: number) => void } 类型道具={ isSettings:布尔值, } | { 索引:编号, 删除:$Pro

我必须在对象中设置两个可选键
index
remove
。但是,如果提供一个,另一个必须在那里。所以它是这样的:

type Props = {
    isSettings: boolean,
} | {
    index: number,
    remove: $PropertyType<FieldProps, 'remove'> // (index: number) => void
}
类型道具={
isSettings:布尔值,
} | {
索引:编号,
删除:$PropertyType/(索引:number)=>void
}

其中第二个对象是可选的。上述操作不起作用,因为它不希望第三个对象中出现
isSettings
。但它始终是必需的。

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每个类型都有一组给定的属性。这就是流量的来源

如果您将类型更改为

type Props = {|
    isSettings: boolean,
|} | {|
    index: number,
    remove: (index: number) => void
|};
然后是像

var obj: Props = ...
if (obj.remove) {
  var n: number = obj.index;
}

将按预期工作,因为存在
remove
意味着必须有一个名为
index
的属性,它是一个
数字

非常感谢您提供了这样一个深入的解决方案!太快了!实际上,我需要这样做:
{|…FieldProps,isSettings:boolean,|}{|
在里面的对象上有一个排列,它会因为不兼容而不断突出显示。有可能使排列准确吗?我应该为此发布另一个问题吗?最好是再问一个问题。我不太清楚,但我确实认为这些功能在涉及排列时有点模糊。我不确定我理解你的意思。该示例将两组属性都分配给对象,这违反了精确的对象类型。如果要删除
isSettings:true
,则必须将
isSettings
放在
的两侧。