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

标签 typescript

鉴于这个稍微人为的例子:

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

为什么 name 和 num 在类型 string | number 的最后一行显然被推断为字符串和数字的数组,你们中的任何人都知道是否有一种方法可以使用类型推断,以便 name 是一个字符串,num 分别是一个数字?

最佳答案

对于数组文字类型推断不推断元组,它推断数组,所以

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

我没有找到这方面的文档,但是 pull request添加对元组的支持在声明它们时从不使用推理,我猜这是故意的。

在您的情况下,您可以指定类型参数:
['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解决方案

自从我发布了原始答案 typescript 以来,它改进了推断其余参数的元组类型的能力。见 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 + "");

关于typescript - 在 TypeScript 中使用元组(类型推断),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48686849/

相关文章:

javascript - 删除数组中的元素

javascript - Webpack resolve.root 和 TypeScript 加载器

angular - 以编程方式检查来自 TypeScript 的 ionic radio

javascript - TypeScript myFunction 不是函数

typescript - 使用TS客户端@pinecone-database/pinecone v0.0.8时出现错误 "PineconeClient: Project name not set. Call init() first."

javascript - Jest/Enzyme/JSDOM document.body.createTextRange 不是函数

angular - 如何对 *ngFor 应用过滤器?

javascript - unhandledRejection 不可分配给信号类型的参数

javascript - typescript 错误 :Property 'contains' does not exist on type 'Element' . ?

angular - typescript : Colon vs Equal To ( Angular Tutorial )