我想知道是否有一种方法可以从元组类型的尾部访问第n个类型,例如...

type UserType = 'vendor' | 'customer' | 'staff';
type SignUpParameters = [string, string, boolean, UserType];

type isAdmin = NthTypeOfTuple<SignUpParameters, -2>; // boolean

推荐答案

没有内置的功能可以做到这一点.有各种对支持这一功能的功能的请求,例如microsoft/TypeScript#26382,它将允许您在类型级别计算类似T['length'] - 2的东西,并以这种方式索引.

目前,您可以编写自己的实用程序类型来以这种方式工作,但它几乎肯定会有奇怪的边缘情况,并且需要recursive conditional types个操作variadic tuples.

一种可能的方法是构建At<T, I>实用程序类型来模拟Array.prototype.at()的行为,正如我(半Jest 地)microsoft/TypeScript#47660中的microsoft/TypeScript#476605054467" rel="nofollow noreferrer">suggested:

type Reverse<T extends readonly any[], U extends any[] = []> =
  T extends readonly [infer F, ...infer R] ? Reverse<R, [F, ...U]> : U

type At<T extends readonly any[], I extends number> =
  `${I}` extends `-${infer J}` ? 
    [never, ...Reverse<T>] extends infer R ? 
      J extends keyof R ? R[J] :
    undefined : 
  never : 
T[I];

Reverse<T>类型是一个tail-recursive conditional type,它反转一个元组,如果负数为负,则At<T, I>使用template literal typesgo 掉负号I,然后索引到T的移位反转版本.是的,太可怕了:

type UserType = 'vendor' | 'customer' | 'staff';
type SignUpParameters = [string, string, boolean, UserType];    
type IsAdmin = At<SignUpParameters, -2>;
// type IsAdmin = boolean

但它确实奏效了.

Playground link to code

Typescript相关问答推荐

Typescript:将内部函数参数推断为子对象键的类型

如何根据数据类型动态注入组件?

Angular 17 -如何在for循环内创建一些加载?

动态调用类型化函数

扩展函数签名中的参数类型,而不使用泛型

输入元素是类型变体的对象数组的正确方法是什么?'

更新为Angular 17后的可选链运算符&?&问题

如何推断计算逻辑的类型

打字脚本中泛型和直接类型重新映射的不同行为

隐式键入脚本键映射使用

如何在typescript中设置对象分配时的键类型和值类型

如何调整对象 struct 复杂的脚本函数的泛型类型?

<;T扩展布尔值>;

打字脚本中的模块化或命名空间

错误:NG02200:找不到类型为';对象';的其他支持对象';[对象对象]';.例如数组

使用&reaction测试库&如何使用提供程序包装我的所有测试组件

基于区分的联合键的回调参数缩小

如何在TypeScript中将元组与泛型一起使用?

Typescript泛型验证指定了keyof的所有键

如何避免TS2322;类型any不可分配给类型never;使用索引访问时