type Pop<T extends any[]> = T extends [...infer I, infer _] ? I : never
这是type-challenge中类型的推荐解决方案。Pop
同样有效的解决方案:
type Pop<T extends any[]> = T extends [...infer U, ...[unknown]]
? U
: never
type Pop<T extends any[]> = T extends [...infer U, unknown]
? U
: never
如果我们需要删除更多类型,我们只需添加:
type Pop<T extends any[]> = T extends [...infer U, ...[unknown, unknown]]
? U
: never
Pop<[1,2,3,4,5]> // [1,2,3]
如果你在没有条件类型的情况下编写相同的东西,你会得到一个常规的合并:
type Merge<T extends any[], K extends any[]> = [...T, ...K]
type m = Merge<[1,2,3], [1,unknown,unknown]>
// ^? [1,2,3,1,unknown,unknown]
这个怎么运作?
类型
Pop
工作原理
I
是根据类型自动从上下文中推断出来的T
;_
是根据类型自动从上下文中推断出来的T
;T extends [...infer I, infer _]
- 在方括号中 - 解构。never
。例子:
解析:
I
将具有[1,2]
,而类型_
将具有3
;[1,2,3] extends [1,2,3] ? [1,2] : never
, where1,2
->...[1,2]
->...infer I
;[1,2,3]
可以匹配[1,2,3]
,我们返回 的类型I
,即[1,2]
.非常感谢@Grundy的详细解释。