在Typescript中隐式创建元组

hc8w905p  于 2022-11-26  发布在  TypeScript
关注(0)|答案(6)|浏览(154)

是否有一种方法可以在不使用类型提示的情况下在Typescript中创建元组。
如果我只是做

const tuple = [1, 2];

元组number[]类型
我能找到的最接近一条线是

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

我是不是漏掉了什么,还是这是唯一的办法?

dphi5xsq

dphi5xsq1#

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

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

并这样使用它:

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

v440hwme2#

Typescript不会从数组文字推断元组类型。您可以显式指定类型,或者创建一个帮助器函数,使其更容易一些,同时仍然可以获得一些推断。

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

编辑

从Python 3.4开始,你也可以使用as constAssert,这样做的好处是不需要额外的函数,但是它会生成一个只读的元组:

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

从Python 3.0开始,您还可以使用rest参数中的元组来推断元组:

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

mwecs4sa3#

从TypeScript 3.4开始,您只需在末尾添加as const即可。

const tuple = [1, 2] as const;

完全归功于@bela53的回答,它有一个更好的例子和到TSPlayground的链接。

zsbz8rwp

zsbz8rwp4#

TypeScript 4.0还有一种隐式推断元组类型的方法:
类型[...T](其中T是一个类似数组的类型参数)可以方便地用于指示元组类型[:]推理的首选项(docs)

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

Playground

vptzau2j

vptzau2j5#

我添加这个答案以供参考,因为我发现as const创建只读元组和其他技术扩展值的类型是一个难题

const tuple = <T extends any[]>(xs: readonly [...T]): T => xs as T;

它可以以两种方式使用:

const a = tuple(['foo', 10] as const)

a的类型为["foo", 10],不是只读,并且typeof a[number]"foo" | 10

const b = tuple(['foo', 10]);

b的类型为[string, number],而typeof b[number]的类型为string | number

owfi6suc

owfi6suc6#

我建议为元组定义一个类型,因为它更具表达力。

type TreeHouse = [location: Location, name: string, capacity: number];

然后使用了

<TreeHouse>[new Location(…), "Treeston", 6]

不幸的是,从我的尝试来看,这个元组文字不能使用参数名。
注意优先级!<TreeHouse>(…)new TreeHouse(…)的优先级不同。

相关问题