2017-03-17 34 views
0

觀察這個打字稿代碼:功能的參數類型通用約束

class cli<T extends string> {} 
let dist = function <T extends string>(m:T,c:cli<T>):void { 

}; 
let a:cli<"foo"> = new cli(); 
dist("bar",a); 

,我想該錯誤是,「酒吧」是不是「富」,但如果你真的檢查有沒有事實錯誤因爲dist推斷出類型變元"foo" | "bar"。我試圖找出如何處理這個問題。

在我看來,有一種方法是使dist函數的方法cli,但在我的實際應用程序這樣做會是...不幸的。

感謝您的任何幫助。

+0

我不知道這是否可以通過推斷來完成。 TypeScript中的類型系統是鴨式打字,它不像Java或C#那樣嚴格打字。由於'foo'和'bar'都是字符串,所以編譯器會擴展它以便它可以工作。 限制類型的一種方法是明確指定類型:'dist <'bar'>('bar',a)'。這會產生錯誤。但我想這不是你想要的。 – unional

+0

那麼這樣做的麻煩在於它依賴於用戶使類型明確,所以它不會真正將它們從任何你知道的錯誤中拯救出來。 – Hunter

回答

1

使它們共享相同類型參數T意味着它們都由相同的約束而不是另一個定義另一個的邊界。如果您希望m的類型受到傳遞給cli的類型參數的限制,則應將它們指定爲單獨的類型參數,其中一個取決於另一個類型參數。示例:

let dist = function <T extends string, U extends T>(m: U, c: cli<T>): void { };

+0

謝謝。這很聰明。 – Hunter