有人知道如何使编译器自动推断元组类型吗?
// Now: (string | number)[]
// Wanted: [string, number][]
const x = [ ["a", 2], ["b", 2] ];
答案 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