我几乎没有学习流程,但根据文档,以下代码应该给我一个错误,因为我正在解构对象并将默认值分配给不是布尔值的"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
既不是数字也不是字符串,所以就类型系统而言,它都是
。因此,您可以显式声明给定绑定的类型,也可以编写代码以使推理起作用。