在TypeScript中使用元组(类型推断)

cma*_*art 1 typescript

给出这个稍微人为的示例:

['List', 'Of', 'Names']
        .map((name, index) => [name, index % 2])
        .map(([name, num]) => );
Run Code Online (Sandbox Code Playgroud)

为什么在类型的最后一行中将name和num string | number明显地推断为字符串和数字的数组,并且您知道吗,是否有人可以使用类型推断来使name为字符串和num为数字?

Tit*_*mir 8

对于数组文字,类型推断不会推断元组,而是推断数组,因此

var foo = ["", 0]; // foo is Array<string | number> not [string, number]
Run Code Online (Sandbox Code Playgroud)

我没有找到有关此文档,但是添加对元组的支持的pull请求在声明它们时从不使用推断,我猜这是故意的。

您可以指定type参数:

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

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 + "");
Run Code Online (Sandbox Code Playgroud)

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 + "");
Run Code Online (Sandbox Code Playgroud)


bel*_*a53 7

您可以使用const 断言

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

看看操场示例