推断元组类型而不是联合类型

时间:2018-02-19 18:40:56

标签: typescript typescript-typings

有人知道如何使编译器自动推断元组类型吗?

// Now: (string | number)[]
// Wanted: [string, number][]
const x = [ ["a", 2], ["b", 2] ];

3 个答案:

答案 0 :(得分:1)

如果我们使用额外的函数来帮助输入一点推理,可以这样做:

function tupleArray<T1, T2, T3>(arr:[T1, T2, T3][]) : typeof arr 
function tupleArray<T1, T2>(arr:[T1, T2][]) : typeof arr 
function tupleArray<T1>(arr:[T1][]) : typeof arr 
function tupleArray(arr:any[]) : any[]{
    return arr;
}

var t = tupleArray([ ["a", 2], ["b", 2] ]) // [string, number][]

如果元组中需要超过3个项目,则可以添加更多重载。

答案 1 :(得分:0)

编译器没有推断出这一点,也没有办法强迫它知道&#34;知道&#34;它。 您可以(并且应该做的)唯一的事情是定义一个扩展Array的接口。像这样:

interface NumStrTuple extends Array<string | number> {
    0: number;
    1: string;
    length: 2;
}

并用它来定义你的const

const x: NumStrTuple = [ ["a", 2], ["b", 2] ];

答案 2 :(得分:0)

您现在可以使用最近添加的 as const 来实现此目的:

const x = [ ["a", 2], ["b", 2] ] as const;
// Type is
// readonly [readonly ["a", 2], readonly ["b", 2]]

https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions