簡體   English   中英

通用標識 function 可以推斷元組類型嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM