为什么会产生错误“其余元素类型必须是数组类型”?
type QWE<T extends [number, string]> = [boolean, ...T]
^^^^ the error is here
答案 0 :(得分:3)
在3.0之前,我们无法将元组或泛型参数传递给函数,因此必须实现这一点。同样,当前在元组中的其余部分仅支持数组,没有人实现将其他元组扩展到给定元组其余部分的功能,而我想实现它需要大量的精力和复杂性。
要在另一个已知元组的末尾添加元组,我们可以使用以下功能:将元组分布到一个函数中,然后将参数类型提取为元组。
type ArgumentTypes<T extends (...a: any) => any> =
T extends (...a: infer A) => any ? A : never;
type QWE<T extends [number, string]> =
ArgumentTypes<(a: boolean, ...r: T) => void>
type R = QWE<[number, string]>
在开始时添加元组会带来更多问题,我相信有一些非常不推荐的技巧可以使用递归类型别名来实现。您还可以定义多个条件以在一个元组中最多支持多个元素,但如果可能的话,我会避免使用
答案 1 :(得分:3)
如果有人发现它有用,这是Titian类型的一种版本,并进行了改进,涵盖了更多情况:
type R = TupleUnshift<boolean, [number, string]> // [boolean, number, string]
type TupleUnshift<A, B extends [...any[]]> = ((a: A, ...r: ForcedTuple<B>) => void) extends (...a: infer R) => any ? R : never
type ForcedTuple<T> =
T extends [
infer A,
infer B,
infer C,
infer D,
infer E,
infer F,
infer G,
infer H,
infer I,
infer J,
infer K,
infer L,
infer M,
infer N,
infer O,
infer P,
infer Q,
infer R,
infer S,
infer T,
infer U,
infer V,
infer W,
infer X,
infer Y,
infer Z
]
?
[A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z]
: T
答案 2 :(得分:2)
使用TypeScript 4.0 variadic tuple types,将项I
添加到元组类型T
变得更加容易:
type Prepend<I, T extends unknown[]> = [I, ...T]
type Append<I, T extends unknown[]> = [...T, I]
type AddBetween<I, T extends unknown[], U extends unknown[]> = [...T, I, ...U]
type PrependTest = Prepend<boolean, [string, number]>
// [boolean, string, number]
type AppendTest = Append<boolean, [string, number]>
// [string, number, boolean]
type AddBetweenTest = AddBetween<boolean, [string], [number]>
// [string, boolean, number]