function reverse(x: number): number;
function reverse(x: string): string;
function reverse(x: number | string): number | string {
return x '1';
}
為什么打字稿可以讓這個函式多載?我想限制數字輸入數字輸出和字串輸入字串輸出。
在我的函式實作中,我特意讓數字輸入字串輸出。我希望在編譯這個 ts 檔案時會拋出一條錯誤訊息,但它沒有。為什么?
環境:沒有 tsconfig.json 和 tsc 版本是 4.4.3
uj5u.com熱心網友回復:
打字稿并不完美。查看Github 問題 #13235以獲取有關此特定缺陷的更多資訊。
基本上你的實作函式不知道存在多載簽名。它被輸入為 returnstring | number并且它回傳string,這是一個完全有效的回傳型別。就是這么簡單。
是的,在這種情況下,即使代碼編譯沒有錯誤,您也可能在運行時出現型別錯誤。這是盲點,沒有很好的方法來覆寫。
可它為什么不完美呢?好吧,從 Github 問題中可以看出這句話更清楚地說明了這一點。
似乎沒有太多證據表明人們經常以一種我們可以可靠地檢測到而不會引入誤報的方式在這里犯錯誤。但真正的問題是,這里的任何實作都將在簽名數量上至少為 O(n^2),并且有許多 .d.ts 檔案,每個函式實際上有幾十個簽名。每次開始時錯誤如此罕見時檢查多載“正確性”的成本和復雜性似乎不值得。
uj5u.com熱心網友回復:
FWIW,在您的情況下,您可能更愿意使用泛型。
您希望輸出型別取決于輸入型別:
function reverse<T extends string | number>(x: T): T {
// ...
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/349982.html
