簡體   English   中英

在 TypeScript 中使用元組(類型推斷)

[英]Using Tuples in TypeScript (Type Inference)

鑒於這個稍微人為的例子:

['List', 'Of', 'Names']
        .map((name, index) => [name, index % 2])
        .map(([name, num]) => );

為什么string | number類型的最后一行是 name 和 num? string | number顯然被推斷為一個字符串和數字數組,你們知道是否有一種方法可以使用類型推斷,以便 name 是一個字符串,num 分別是一個數字嗎?

對於數組文字類型推斷不推斷元組,它推斷數組,所以

var foo = ["", 0]; // foo is Array<string | number> not [string, number]

我還沒有找到這方面的文檔,但是添加對元組支持的拉取請求在聲明它們時從不使用推理,我猜這是故意的。

在您的情況下,您可以指定類型參數:

['List', 'Of', 'Names']
        .map<[string, number]>((name, index) => [name, index % 2])
        .map(([name, num]) => name + "");

2.9及以下解決方案

或者,如果這對您來說是一個常見問題,則創建一個元組輔助函數:

function tuple<T1, T2, T3, T4, T5>(data: [T1, T2, T3, T4, T5]) : typeof data
function tuple<T1, T2, T3, T4>(data: [T1, T2, T3, T4]) : typeof data
function tuple<T1, T2, T3>(data: [T1, T2, T3]) : typeof data
function tuple<T1, T2>(data: [T1, T2]) : typeof data
function tuple(data: Array<any>){
    return data;
}

['List', 'Of', 'Names']
        .map((name, index) => tuple([name, index % 2]))
        .map(([name, num]) => name + "");

3.0 解決方案

自從我發布了原始答案打字稿以來,它改進了推斷其余參數的元組類型的能力。 有關詳細信息,請參閱PR 有了這個特性,我們可以編寫更短版本的tuple函數:

function tuple<T extends any[]> (...data: T){
    return data;
}

['List', 'Of', 'Names']
        .map((name, index) => tuple(name, index % 2))
        .map(([name, num]) => name + "");

您可以使用const 斷言

['List', 'Of', 'Names']
    .map((name, index) => [name, index % 2] as const) // insert `as const` here
    .map(([name, num]) => { }); // name: string, num: number

看看操場示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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