在Typescript中隐式创建一个元组

时间:2018-04-09 09:21:23

标签: typescript

有没有一种没有类型提示的方法可以在Typescript中创建一个元组。

如果我只是做

const tuple = [1, 2];

元组number[]

的类型

我最接近oneliner的是

const tuple: [number, number] = [1, 2];

我错过了什么,或者这是唯一的方法吗?

4 个答案:

答案 0 :(得分:12)

使用打字稿3.0,您可以拥有自己的实用程序功能:

const tuple = <T extends any[]>(...args: T): T => args

并以这种方式使用它:

const tup = tuple(1, 2) // tup type is [number, number]

答案 1 :(得分:5)

Typescript不会从数组文字中推断出元组类型。你可以像你一样明确指定类型,或者你可以创建一个辅助函数来使它更容易并且仍然得到一些推断。

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;
}  

var t = tuple([1, '']);

修改

从3.4开始,您还可以使用as const断言。这确实具有不需要额外功能但是它将生成只读元组的优点:

var t = [1, ''] as const;
t[0] = 1  //err

答案 2 :(得分:1)

TypeScript 4.0 还有一种隐式推断元组类型的方法:

<块引用>

类型 [...T],其中 T 是一个类似数组的类型参数,可以方便地用于指示对元组类型推断的偏好[:] (docs)

const tuple = <T extends unknown[]>(args: [...T]): T => args
tuple(["A", "B"]) // [string, string]

Playground

答案 3 :(得分:0)

从 TypeScript 3.4 开始,您可以在末尾简单地添加 as const

const tuple = [1, 2] as const;

完全感谢 @bela53 的回答,其中有一个更好的示例和指向 TS 游乐场的链接。