前言
我们知道js中,可以对数组的首尾,进行增加/减少元素的操作。
ts的type中同理,可以进行这种操作。
unshift/push
首先看unshift和push这两种。
把这两种放在一起,是因为他们都是增加,方法类似。
type Unshift<T extends any[], U> = [U,...T]
type Push<T extends any[], U> = [...T,U]
shift/pop
这两种都是减少。
infer出需要减少的项,结合extends进行never即可。
I是保留的数组,R是减少的那一项。
type Shift<T extends any[]> = T extends [infer R, ...infer I] ? I : never
type Pop<T extends any[]> = T extends [...infer I, infer R] ? I : never