2017-08-11 33 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既不是一個數,也不是一個字符串,它是既作爲就類型系統而言。

因此,您要麼顯式聲明給定綁定的類型,要麼編寫代碼以便推理能夠工作。

相關問題