[英]Can a generic identity function infer tuple types?
我有一個 function 可以有效地返回其參數,當前鍵入為:
function h<T>(x: T): T {
// Actually do some more things, then:
return x;
}
當我在操場上嘗試這種類型時,泛型類型被推斷為我期望的以下內容:
h(123); // T: 123
h('stringval'); // T: 'stringval'
但是當我傳遞一個元組時,它給了我一個聯合數組類型:
h(['a', 2]); // T: (string|number)[]
有沒有辦法編寫h(x)
s 類型以便推斷元組 arguments ,還是我需要使用如下幫助器:
function tuple<T extends any[]>(...args: T): T {
return args;
}
h(tuple('a', 2));
我不想強迫人們手動標記他們的元組類型,而是盡可能地推斷它們。
但是當我傳遞一個元組時,它給了我一個聯合數組類型:
h(['a', 2]); // T: (string|number)[]
你寫“當我傳遞一個元組時”,但你沒有傳遞一個元組。 您正在傳遞一個數組。
有沒有辦法編寫
h(x)
s 類型以便推斷元組 arguments
TypeScript 永遠不會從數組文字中推斷出元組類型。 元組是使用arrays 的一種特殊方式。 TypeScript 無法讀懂您的想法,它不可能知道您打算如何使用該數組,因此始終需要顯式鍵入元組。
您的身份 function 返回元組的唯一方法是傳遞一個元組。 當您向它傳遞一個數組文字時,您不是在傳遞一個元組,而是在傳遞一個數組。
如果您實際上傳遞了一個元組,那么您的身份 function 就可以正常工作:
const thisIsAnArray = ['a', 2]; // inferred as (string | number)[]
const thisIsATuple: [string, number] = ['a', 2];
const thisIsAlsoATuple = ['a', 2] as const;
h(thisIsAnArray); // T: (string | number)[]
h(thisIsATuple); // T: [string, number]
h(thisIsAlsaATuple); // T: readonly ['a', 2]
請注意,這與您的 function 無關。 您的 function 工作得非常好:它返回的正是傳入的內容,其返回類型正是參數的類型。
在你的測試中,你從來沒有傳入一個元組,因此你沒有得到一個元組。 你得到的正是你傳入的內容:一個數組。
這是一個對我有用的解決方案:
function h<T extends any[] | []>(x: T): T;
h([1, 2, "hello"]); // => [number, number, string]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.