在Typescript中隐式创建一个元组

jay*_*jay 6 typescript

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

如果我只是这样做

const tuple = [1, 2];
Run Code Online (Sandbox Code Playgroud)

元组的类型 number[]

我最接近一个oneliner的是

const tuple: [number, number] = [1, 2];
Run Code Online (Sandbox Code Playgroud)

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

Gui*_*ume 13

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

const tuple = <T extends any[]>(...args: T): T => args
Run Code Online (Sandbox Code Playgroud)

并以这种方式使用它:

const tup = tuple(1, 2) // tup type is [number, number]
Run Code Online (Sandbox Code Playgroud)


jay*_*jay 9

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

const tuple = [1, 2] as const;
Run Code Online (Sandbox Code Playgroud)

完全归功于@bela53的回答,其中有一个更好的示例并链接到 TS 游乐场。


Tit*_*mir 8

Typescript不会从数组文字中推断出元组类型。您可以根据需要显式指定类型,也可以创建一个辅助函数以使其变得更简单,并且仍然可以得出一些推断。

const tuple = <T extends [any] | any[]>(args: T): T => args
tuple(["A", "B"]) // [string, string]
Run Code Online (Sandbox Code Playgroud)

编辑

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

var t = [1, ''] as const;
t[0] = 1  //err
Run Code Online (Sandbox Code Playgroud)

从3.0开始,您还可以在rest参数中起诉元组以推断元组:

const tuple = <T extends any[]>(...args: T): T => args
tuple("A", "B") // [string, string]
Run Code Online (Sandbox Code Playgroud)


for*_*d04 4

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

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

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

操场