是否有一种方法可以在不使用类型提示的情况下在Typescript中创建元组。如果我只是做
const tuple = [1, 2];
元组number[]类型我能找到的最接近一条线是
number[]
const tuple: [number, number] = [1, 2];
我是不是漏掉了什么,还是这是唯一的办法?
dphi5xsq1#
使用typescript 3.0,您可以拥有自己的实用程序函数:
const tuple = <T extends any[]>(...args: T): T => args
并这样使用它:
const tup = tuple(1, 2) // tup type is [number, number]
v440hwme2#
Typescript不会从数组文字推断元组类型。您可以显式指定类型,或者创建一个帮助器函数,使其更容易一些,同时仍然可以获得一些推断。
const tuple = <T extends [any] | any[]>(args: T): T => args tuple(["A", "B"]) // [string, string]
编辑
从Python 3.4开始,你也可以使用as constAssert,这样做的好处是不需要额外的函数,但是它会生成一个只读的元组:
as const
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]
mwecs4sa3#
从TypeScript 3.4开始,您只需在末尾添加as const即可。
const tuple = [1, 2] as const;
完全归功于@bela53的回答,它有一个更好的例子和到TSPlayground的链接。
zsbz8rwp4#
TypeScript 4.0还有一种隐式推断元组类型的方法:类型[...T](其中T是一个类似数组的类型参数)可以方便地用于指示元组类型[:]推理的首选项(docs)
[...T]
T
const tuple = <T extends unknown[]>(args: [...T]): T => args tuple(["A", "B"]) // [string, string]
Playground
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
a
["foo", 10]
typeof a[number]
"foo" | 10
const b = tuple(['foo', 10]);
b的类型为[string, number],而typeof b[number]的类型为string | number
b
[string, number]
typeof b[number]
string | number
owfi6suc6#
我建议为元组定义一个类型,因为它更具表达力。
type TreeHouse = [location: Location, name: string, capacity: number];
然后使用了
<TreeHouse>[new Location(…), "Treeston", 6]
不幸的是,从我的尝试来看,这个元组文字不能使用参数名。注意优先级!<TreeHouse>(…)与new TreeHouse(…)的优先级不同。
<TreeHouse>(…)
new TreeHouse(…)
6条答案
按热度按时间dphi5xsq1#
使用typescript 3.0,您可以拥有自己的实用程序函数:
并这样使用它:
v440hwme2#
Typescript不会从数组文字推断元组类型。您可以显式指定类型,或者创建一个帮助器函数,使其更容易一些,同时仍然可以获得一些推断。
编辑
从Python 3.4开始,你也可以使用
as const
Assert,这样做的好处是不需要额外的函数,但是它会生成一个只读的元组:从Python 3.0开始,您还可以使用rest参数中的元组来推断元组:
mwecs4sa3#
从TypeScript 3.4开始,您只需在末尾添加
as const
即可。完全归功于@bela53的回答,它有一个更好的例子和到TSPlayground的链接。
zsbz8rwp4#
TypeScript 4.0还有一种隐式推断元组类型的方法:
类型
[...T]
(其中T
是一个类似数组的类型参数)可以方便地用于指示元组类型[:]推理的首选项(docs)Playground
vptzau2j5#
我添加这个答案以供参考,因为我发现
as const
创建只读元组和其他技术扩展值的类型是一个难题它可以以两种方式使用:
a
的类型为["foo", 10]
,不是只读,并且typeof a[number]
为"foo" | 10
b
的类型为[string, number]
,而typeof b[number]
的类型为string | number
owfi6suc6#
我建议为元组定义一个类型,因为它更具表达力。
然后使用了
不幸的是,从我的尝试来看,这个元组文字不能使用参数名。
注意优先级!
<TreeHouse>(…)
与new TreeHouse(…)
的优先级不同。