繁体   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