javascript - 为什么具有已定义 Prop 的对象类型不是 Flow 中具有可选 Prop 的对象类型的子类型?

标签 javascript flowtype

在 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/

相关文章:

javascript - 想要调用一个文件中的函数,该函数的定义位于另一文件中

javascript - 将多个字符串参数传递给 Jquery 函数

javascript - GraphQL 在突变时返回 null

javascript - "flow check-contents"和 "flow suggest"

node.js - babel 未剥离流程的类型提示

java - 复选框的 onchange 方法不适用于 jsf 和 javascript

javascript - 为什么 5 > 4 > 3 != (5 > 4 && 4 > 3) 在 Javascript 中是真的?

javascript - Flow 无法识别过滤不可变列表

javascript - 为具有多个模块位置的 webpack resolve.modules 设置采用 flowtype 配置

javascript - (facebook) flow - 类型注解是如何工作的