【问题标题】:Shouldn't this flow type default assignment give me an error?这种流类型默认分配不应该给我一个错误吗?
【发布时间】:2017-08-12 06:10:23
【问题描述】:

我几乎没有学习流程,但根据文档,以下代码应该给我一个错误,因为我正在解构对象并将默认值分配给不是布尔值的“overrideKeyProp”。

没问题,没有错误:

type KeyGenCfgType = {|
  topic: Topic,
  keyProp?: string,
  overrideKeyProp?: boolean
|};

function cfgTypeKeyGen(kGen: KeyGenCfgType) {
  const { keyProp, overrideKeyProp = 1 } = kGen;
}

这给了我一个关于属性 overrideKeyProp 的不匹配类型的错误:

type KeyGenCfgType = {|
  topic: Topic,
  keyProp?: string,
  overrideKeyProp?: boolean
|};

function cfgTypeKeyGen({ keyProp, overrideKeyProp = 1 }: KeyGenCfgType) {
}

//number: This type is incompatible with boolean 

这也给了我一个错误:

type KeyGenCfgType = {|
  topic: Topic,
  keyProp?: string,
  overrideKeyProp?: boolean
|};

function cfgTypeKeyGen(kGen: KeyGenCfgType) {
  const { keyProp, overrideKeyProp = 1, nope } = kGen;
}
// property `nope`: Property not found in object type    

因此它能够识别出我正在尝试解构一个不在我为其定义的流类型中的属性,但它无法识别我没有在属性上分配正确类型的值,除非我在函数的签名中进行解构。

【问题讨论】:

  • 将代码放入问题中,而不是图像。我们无法从图像中复制粘贴文本。
  • @epascarello 完成。我不知道我在想什么。我还添加了其他行为示例。

标签: javascript flowtype


【解决方案1】:

关键是,当您没有为给定变量声明为 Flow 指定类型时,它会推断类型。

function someFunc({ someProp = 1 }: SomeType) {}

明确表示“类型是具有这些属性的对象,使用该属性的类型创建一个名为 someProp 的变量。在这种情况下分配一个数字显然是一个错误,因为您已经明确说明了应该使用 @ 的类型987654324@.

let { someProp = 1, unknownProp } = fnArg;

将失败,因为 Flow 确定 unknownProp 不是 fnArg 对象上可用的属性。

所以对于你的问题,让我们看看你的例子

function someFunc(fnArg: SomeType) {
    let { someProp = 1 } = fnArg;
}
  • 您已经声明了函数输入类型,因此 Flow 知道 someProp 存在于对象上,并且 flow 知道 fnArg.someProp 是什么类型。
  • 您已指定默认值 1

就是这样。你没有告诉 Flow someProp 变量应该是什么类型。你可以这样做

let { someProp = 1 }: SomeType = fnArg;

这会抛出你所期望的错误。

Flow 正在做的是推断类型。因为它看到在一部分你正在做let someProp = fnArg.someProp,它可能是一个string,但在你正在做的代码的另一个分支let someProp = 1,所以它也可能是一个数字。你没有做任何事情告诉 Flow someProp 必须是一个字符串。

您在 Flow 中的一般代码中会看到类似的行为:

let someVal;
if (Math.random()){
    someVal = "a string";
} else {
    someVal = 4;
}

这不是错误,Flow 推断 let someVal;let someVal: number|string;

如果您尝试use the field for something,您可以在类似您的代码中看到相同的内容

type SomeType = {
  prop: string
};

function thing(obj: SomeType) {
  const {prop = 1} = obj;

  let f1: string = prop;
  let f2: number = prop;
}

哪些错误

let f1: string = prop;
                 ^ number. This type is incompatible with
let f1: string = prop;
        ^ string
let f2: number = prop;
                 ^ string. This type is incompatible with
let f2: number = prop;
        ^ number

因为prop 既不是数字也不是字符串,就类型系统而言,两者都是。

因此,您可以明确声明给定绑定的类型,或者编写代码以使推理起作用。

【讨论】:

    猜你喜欢
    • 2021-08-12
    • 2023-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多