2014-01-06 94 views
1
重載一個泛型函數

我在做什麼錯在這裏:不能在打字稿

export function fail<a>(problem: SomeProblem): a; 
export function fail<a>(message: string): a; 
export function fail<a>(messageOrProblem: any): a { throw Error(); } 

編譯器說:因爲他們來自不同的地方

TS2148: Build: Overload signature is not compatible with function definition. 

回答

5

類型此參數被認爲是「不同」 。你應該寫這個像這樣:

export function fail<a>(problem: SomeProblem): a; 
export function fail<a>(message: string): a; 
export function fail(messageOrProblem: any): any { throw Error(); } 

順便說一句,只有一個返回值的位置使用泛型類型參數是有點反模式。由於您無法根據a確定要返回的值,因此返回any比返回不可感知的泛型類型要準確得多。我稱之爲「移動投」模式:

// Bad 
x = fail<string>('foo'); // This looks more typesafe than it is 
// Good 
x = <string>fail('foo'); // Let's be honest with ourselves 
+1

很好的答案!只要提一下,使用返回類型驅動泛型參數在JS承諾建模中變得非常重要,並允許自動推斷'then'鏈接 – basarat