2017-08-11 37 views
0

我几乎没有学习流程,但根据文档,下面的代码应该给我一个错误,因为我解构对象并将默认值分配给不是布尔值的'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  

所以它能够识别出我试图解构出一个不属于流类型的属性我为它定义,但它不承认我没有在属性上分配正确的类型值,除非我在函数的签名中进行解构。

+2

将代码放在问题中,而不是图像。我们无法复制图片中的粘贴文字。 – epascarello

+0

@epascarello完成。我不知道我在想什么。我还添加了其他行为示例。 – SirMyztiq

回答

0

关键的是,如果您没有给定给定的变量声明的流类型,它会推断出类型。

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

明确地说:“该类型是具有这些属性的对象,使与该属性的类型,称为someProp变量。分配,因为你已经明确表示类型应该是什么在这种情况下,一些显然是一个错误与: SomeType。因为流量肯定知道

let { someProp = 1, unknownProp } = fnArg; 

会失败是unknownProp不是fnArg对象上可用的属性。

所以你的问题,让我们来看看你的榜样

function someFunc(fnArg: SomeType) { 
    let { someProp = 1 } = fnArg; 
} 
  • 声明了函数的输入类型,所以流量知道someProp存在的对象,和流量知道fnArg.someProp是什么类型。
  • 您已指定默认1

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

let { someProp = 1 }: SomeType = fnArg; 

这会抛出你期待的错误。

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

你看流量一般代码类似的行为:

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

这是不是一个错误,流量推断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既不是一个数,也不是一个字符串,它是既作为就类型系统而言。

因此,您要么显式声明给定绑定的类型,要么编写代码以便推理能够工作。

相关问题