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)
您唯一缺少的是当前不支持这种推断。也许它将在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作为练习留给您(这是人们在想变得聪明而不是懒惰时所说的话)。
无论如何,希望能帮助您取得进步。祝好运!
| 归档时间: |
|
| 查看次数: |
579 次 |
| 最近记录: |