如何在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>
    
    一些解释:

  • typealias
    Reverse
    中的直接引用类型
    Reverse
    将导致循环引用错误
  • wrap
    Reverse
    输入函数类型(
    ()=>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];