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
放在
的两侧。