打字稿通用元组错误其余元素

Dan*_*rez 2 typescript

Typescript给我一个通用元组rest元素的错误

type Tuple<Value extends any[]> = [...Value];
Run Code Online (Sandbox Code Playgroud)

错误:

$ tsc
src/index.ts:1:36 - error TS2574: A rest element type must be an array type.

1 type Tuple<Value extends any[]> = [...Value];
Run Code Online (Sandbox Code Playgroud)

我在这里想念什么?

  • 打字稿版本: typescript@3.1.6

更新:

type Tuple<HEAD, TAIL extends any[]> = [HEAD, ...TAIL];
Run Code Online (Sandbox Code Playgroud)

不起作用

虽然这有效

type Tuple<Value extends any[]> = [...any[]];
Run Code Online (Sandbox Code Playgroud)

jca*_*alz 6

您唯一缺少的是当前不支持这种推断。也许它将在TypeScript的将来版本中。幸运的是,还是有办法通过表达在一个方面所需的操作做你想要的功能参数,因为作为打字稿3.0的,有一种方法来元组/数组类型和函数参数之间进行转换,并且可以使用infer如需要参数类型。

这是以下一种可能的实现Tail

type Tail<T extends any[]> = 
  ((...t: T) => void) extends ((x: any, ...u: infer U) => void) ? U : never;

type TestTail = Tail<[1,2,3,4]>; // [2,3,4]
Run Code Online (Sandbox Code Playgroud)

请注意,您采用了元组/数组类型T,将其散布到参数列表,然后推断出第一个参数之后的所有内容,作为另一个元组/数组其余类型。

同样,您可以采用Tuple我称之为的方式来实现Cons

type Cons<H, T extends any[]> = 
  ((h: H, ...t: T) => void) extends ((...u: infer U) => void) ? U : never;

type TestCons = Cons<string, [number, boolean]>; // [string, number, boolean]
Run Code Online (Sandbox Code Playgroud)

我将Head作为练习留给您(这是人们在想变得聪明而不是懒惰时所说的话)。

无论如何,希望能帮助您取得进步。祝好运!