此流类型默认分配不应该给我一个错误吗?



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

这没关系,没有错误:

type KeyGenCfgType = {|
topic: Topic,
keyProp?: string,
overrideKeyProp?: boolean
|};
function cfgTypeKeyGen(kGen: KeyGenCfgType) {
const { keyProp, overrideKeyProp = 1 } = kGen;
}

这给了我一个错误,用于属性覆盖KeyProp上的不匹配类型:

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    

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

关键是,当您没有为给定变量声明的 Flow 提供类型时,它将推断该类型。

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

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

let { someProp = 1, unknownProp } = fnArg;

将失败,因为 Flow 可以肯定地知道unknownProp不是fnArg对象上可用的属性。

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

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

就是这样。您尚未告诉 FlowsomeProp变量应该是什么类型。你可以做

let { someProp = 1 }: SomeType = fnArg;

这将抛出您预期的错误。

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

您可以在常规代码的 Flow 中看到类似的行为:

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

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

如果您尝试将该字段用于某些内容,则可以在像您这样的代码中看到相同的内容

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既不是数字也不是字符串,所以就类型系统而言,它都是

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

相关内容

最新更新