Pop
问题描述
在此挑战中建议使用TypeScript 4.0
实现一个泛型Pop<T>,它接受一个数组T,并返回一个由数组T的前 N-1 项(N 为数组T的长度)以相同的顺序组成的数组。
例如
type arr1 = ['a', 'b', 'c', 'd']
type arr2 = [3, 2, 1]
type re1 = Pop<arr1> // expected to be ['a', 'b', 'c']
type re2 = Pop<arr2> // expected to be [3, 2]
额外:同样,您也可以实现Shift,Push和Unshift吗?
// ============= Test Cases =============
import type { Equal, Expect } from './test-utils'
type cases = [
Expect<Equal<Pop<[3, 2, 1]>, [3, 2]>>,
Expect<Equal<Pop<['a', 'b', 'c', 'd']>, ['a', 'b', 'c']>>,
Expect<Equal<Pop<[]>, []>>,
Expect<Equal<Push<[], 1>, [1]>>,
Expect<Equal<Push<[1, 2], '3'>, [1, 2, '3']>>,
Expect<Equal<Push<['1', 2, '3'], boolean>, ['1', 2, '3', boolean]>>,
Expect<Equal<Unshift<[], 1>, [1]>>,
Expect<Equal<Unshift<[1, 2], 0>, [0, 1, 2]>>,
Expect<Equal<Unshift<['1', 2, '3'], boolean>, [boolean, '1', 2, '3']>>,
Expect<Equal<Shift<[3, 2, 1]>, [2, 1]>>,
Expect<Equal<Shift<['a', 'b', 'c', 'd']>, [ 'b', 'c', 'd']>>,
Expect<Equal<Shift<[1]>, []>>
]
// ============= Your Code Here =============
// 答案
type Pop<T extends unknown[]> = T extends [...infer F, unknown] ? F : []
type Push<T extends unknown[], U> = [...T, U]
type Shift<T extends unknown[]> = T extends [unknown, ...infer U] ? U : []
type Unshift<T extends unknown[], U> = [U, ...T]
上一题 Last of Array 中我们已经实现了返回数组的最后一个元素的类型,这道题刚好那道题思路相反,我们需要使用 infer 关键字拿到数组的前半段内容即可。Push 和Unshift 在之前已经实现过了,这里就不讲思路了。Shift 也十分简单,这里就不在解释了。