2016-10-05 40 views
1

在我的代碼中,我想返回一個高階函數並將我的參數類型傳遞給返回函數。最小縮減代碼如下所示。當返回函數時,流型不保留通用函數參數

function curry<A, B: A>(a: A): (b: B) => void { 
    return() => {} 
} 

curry(123)("123") // expected error but not 

我想知道爲什麼B不流向返回函數。看起來返回函數的類型爲(b: any) => void

我知道在這個例子中,我可以改變綁定到簽名的類型,如(a: A) => (b: A) => void。但是我的真實場景更復雜,需要幻像類型作爲綁定,看起來像上面的B

所以問題是,B實例化到什麼類型?我可以對返回函數的參數位置做一個類型參數流嗎?論證位置中的類型能否影響實際論證的類型推斷?

回答

4

返回的函數的類型爲(b: string) => void,你可以看到運行type-at-pos命令

// @flow 

function curry<A, B: A>(a: A): (b: B) => void { 
    return() => {} 
} 

const f = curry(123) 
f("123") 

運行flow type-at-pos index.js 7 7你:

(b: string) => void 

記住的是,由於類型推斷是如何工作的類型A(因此B)將相應地更改爲以下調用

const f = curry(123) // <= f now has type (b: string | boolean) => void 
f("123") 
f(true) 
+1

感謝您回答我的第一個問題。但我仍然想知道爲什麼'void'被推斷出來,因爲'void'不是'number'的子類型。你能否詳細說明「類型推理如何工作」?我不知道我在哪裏可以找到這種情況的良好參考。 –