打字稿:如何将项目添加到元组?

Nur*_*yev 4 typescript typescript-typings

为什么这会产生错误“其余元素类型必须是数组类型。”?

type QWE<T extends [number, string]> = [boolean, ...T]
                                                 ^^^^ the error is here
Run Code Online (Sandbox Code Playgroud)

Nur*_*yev 6

如果有人觉得它有用,这是提香类型的一个版本,改进涵盖了更多情况:

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
Run Code Online (Sandbox Code Playgroud)


for*_*d04 6

使用 TypeScript 4.0可变元组类型,将项目添加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]
Run Code Online (Sandbox Code Playgroud)

游乐场示例代码


Tit*_*mir 5

在 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]>
Run Code Online (Sandbox Code Playgroud)

在开始时添加元组更成问题,我相信有一些非常不推荐的黑客可以使用递归类型别名来实现这一点。您还可以定义多个条件来支持一个元组中的多个元素,但如果可能的话我会避免它