在 Flow 中,我可以声明一个带有可选 prop 的对象类型,这样定义了该 prop 的对象就可以满足它。
function getName(thing: {name?: string}): string {
return thing.name || 'unknown';
}
getName({name: 'bob'}); // works
但是,如果我在传递参数之前为其声明一个对象类型,Flow 会记录一个错误。
const thing: {name: string} = {name: 'bob'};
getName(thing); // error
那么为什么定义了prop的类型不满足optional相同prop的类型呢?我将如何修复这些注释?
最佳答案
声明类型时
function getName(thing: {name?: string}): string {
return thing.name || 'unknown';
}
这意味着它对你的函数来说是类型安全的
function getName(thing: {name?: string}): string {
thing.name = undefined;
return "anything";
}
因为你说过 name
可以是 undefined
。
鉴于此,
const thing: {name: string} = {name: 'bob'};
getName(thing); // error
会破坏类型安全,值将不再是字符串。
这里的解决方案是使用property variance .在您的用例中,这在您的用例中本质上意味着您声明您的输入 name
property` 不能在函数内部更改。
function getName(thing: { +name?: string }): string {
return thing.name || 'unknown';
}
这让 Flow 知道修改 name
是不允许的。如果它知道,那么可以安全地传入一个 {name: string}
对象,这将使您的代码能够工作。
关于javascript - 为什么具有已定义 Prop 的对象类型不是 Flow 中具有可选 Prop 的对象类型的子类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47021866/