我有一個看起來像這樣的函式:
function getFirstDefined(...values: any) {
for (let value of values) {
if (!!value) {
return value;
}
}
return undefined;
}
它基本上獲取引數串列中的第一個未定義值并回傳它。
問題是我必須向它添加型別,并且我希望它具有基于傳遞給方法的引數型別的動態聯合型別。
例如:
const var1: string = "Hello world!";
const var2: number;
const var3: boolean = false;
// Should have return type: string | number | boolean | undefined
getFirstDefined(var1, var2, var3);
我試圖這樣做:
function getFirstDefined<T extends any>(...values: T[]): T | undefined {
for (let value of values) {
if (!!value) {
return value;
}
}
return undefined;
}
但它“鎖定”了函式,只允許相同型別的值。
const var1: string = "Hello world!";
const var2: number;
const var3: boolean = false;
// Error: var2 and var3 are not strings
getFirstDefined(var1, var2);
有可能做這樣的事情嗎?
uj5u.com熱心網友回復:
您可以改為將泛型更改為陣列本身。然后,它將允許專案不同。之后,對陣列泛型進行索引number以獲取陣列中值型別的聯合,并將其與一個聯合放在一起,undefined從而獲得您的預期行為。
function getFirstDefined<T extends unknown[]>(...values: T): T[number] | undefined {
for (let value of values) {
if (!!value) {
return value;
}
}
return undefined;
}
const foo = getFirstDefined("hey", 2, 5); // string | number | undefined
const asdf = getFirstDefined(5, "hey"); // string | number | undefined
const asdf2 = getFirstDefined(); // undefined
TypeScript Playground 鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/451838.html
標籤:打字稿
上一篇:如何在Angular12中將一個延遲加載模塊組件訪問到另一個延遲加載模塊組件?
下一篇:為什么是這個數字型別?(打字稿)
