我想知道是否有一种方法可以从元组类型的尾部访问第n个类型,例如...
type UserType = 'vendor' | 'customer' | 'staff';
type SignUpParameters = [string, string, boolean, UserType];
type isAdmin = NthTypeOfTuple<SignUpParameters, -2>; // boolean
我想知道是否有一种方法可以从元组类型的尾部访问第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
但它确实奏效了.