[英]What's the best way to declare a TypeScript function with a discriminated union that returns the same type as its parameter?
鑒於這個簡化的 vanilla JS 函數:
function getStringOrNumber(val) {
if (typeof val === 'string') {
return 'It was a string';
} else {
return 5;
}
}
我怎么能告訴 TypeScript 當它得到一個字符串時它返回一個字符串,當它得到一個數字時它返回一個數字?
我嘗試了不同的方法,發現使用這些重載是有效的,但它似乎過於復雜,我想知道我是否遺漏了什么。 特別是,在這個解決方案中,我不明白為什么需要第三行(有關更多信息,請參見下面的鏈接)。
function useOverloadsExtra(val: string): string
function useOverloadsExtra(val: number): number
function useOverloadsExtra(val: string | number): string | number
function useOverloadsExtra(val: string | number): string | number {
if (typeof val === 'string') {
return 'It was a string';
} else {
return 5;
}
}
您的重載解決方案很接近。 問題出在你的測試上。 在您的測試中,您正在調用傳遞聯合作為參數的方法,但聯合不是允許的值:只有string
和number
。 最后一個重載(“實現重載”) 不是簽名的一部分。 因此,您的測試必須執行縮小,如下所示:
function getValOverloads(val: string | number): string | number {
if (typeof val === 'string')
return useOverloads(val);
else
return useOverloads(val);
}
如果您希望能夠傳遞聯合(從而接收聯合作為返回值),您應該添加第三個重載(就像您在useOverloadsExtra
上useOverloadsExtra
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.