如何在typescript中编写“Invert”类型以反转元组的顺序 类型a=[1,2,3] 类型反转=??? 类型b=反向//应产生[3,2,1]
我很难理解元组的如何在typescript中编写“Invert”类型以反转元组的顺序 类型a=[1,2,3] 类型反转=??? 类型b=反向//应产生[3,2,1],typescript,tuples,type-level-computation,Typescript,Tuples,Type Level Computation,我很难理解元组的Invert类型的定义, 也是一个Init和Last类型,尽管它们可以相互构造 我所尝试的: 在函数参数定义中定位类型并推断Rest部分,这种方法只得到带有Rest参数的Tail部分 这仅在您知道阵列长度时有效: 类型a=[1,2,3] 类型反转=[T[2],T[1],T[0]; 类型b=在类型脚本项目发布时反转): 导出类型前置= ((…:加数,…:元组)=>any)扩展(…:推断结果)=>any)?结果:从未; 导出类型反向={ 0:前缀; 1:((…:元组)=>any)扩展
Invert
类型的定义,
也是一个Init
和Last
类型,尽管它们可以相互构造
我所尝试的:
Rest
部分,这种方法只得到带有Rest参数的Tail
部分类型a=[1,2,3]
类型反转=[T[2],T[1],T[0];
类型b=在类型脚本项目发布时反转):
导出类型前置=
((…:加数,…:元组)=>any)扩展(…:推断结果)=>any)?结果:从未;
导出类型反向={
0:前缀;
1:((…:元组)=>any)扩展((…:首先推断
颠倒
:从不;
}[Tuple扩展了[any,…any[]?1:0];
类型b=反向;//b型=[3,2,1]
从typescript 4.0开始
接近反向类型的代码比以前容易多了,比如
type Reverse=ReturnType Reverse:()=>R>
一些解释:
typealiasReverse
中的直接引用类型Reverse
将导致循环引用错误
wrapReverse
输入函数类型(()=>Reverse
)将选择退出循环引用错误
如果类型表达式可以静态解析,编译器将尝试解析它,因此ReturnType Tup>
不会解决这个问题,但是
ReturnType
可以
TypeScript 4.1引入了递归条件类型
它们允许实现元组反转函数,如下所示:
type Reverse<Tuple> = Tuple extends [infer Head, ...infer Rest]
? [...Reverse<Rest>, Head] : [];
const test: Reverse<[1,2,3,4]> = [4,3,2,1];
type Reverse=元组扩展[推断头部,…推断休息]
? […反面,头部]:[];
常数测试:反向=[4,3,2,1];
实际上,我想得到一个泛型版本如果你指的是反转任意数量数组项的类型定义,这是不可能的。正如您前面提到的,这需要一个head-and-tail操作符,而这又需要一个rest操作符与通用约束的递归相结合。对于泛型,两者都不存在。@Minami我的最后一条评论不正确,存在泛型版本。查看我的更新答案。@1y1nq很好的解决方案
type Reverse<Tuple> = Tuple extends [infer Head, ...infer Rest]
? [...Reverse<Rest>, Head] : [];
const test: Reverse<[1,2,3,4]> = [4,3,2,1];