[TypeScript] Type Challenges #3062 - Shift

41 阅读1分钟

题目描述

Implement the type version of Array.shift

For example

type Result = Shift<[3, 2, 1]> // [2, 1]

题解

// ============= Test Cases =============
import type { Equal, Expect } from './test-utils'

type cases = [
  // @ts-expect-error
  Shift<unknown>,
  Expect<Equal<Shift<[]>, []>>,
  Expect<Equal<Shift<[1]>, []>>,
  Expect<Equal<Shift<[3, 2, 1]>, [2, 1]>>,
  Expect<Equal<Shift<['a', 'b', 'c', 'd']>, ['b', 'c', 'd']>>,
]


// ============= Your Code Here =============
type Shift<
  T extends unknown[]
> = 
	T extends [unknown, ...infer Tail] 
		? Tail 
		: []
  • 条件类型:

    • T extends [unknown, ...infer Tail] ? Tail : []

      • 如果T是非空数组:

        • 使用unknown表示第一个元素,将剩余部分推导为Tail

        • 返回Tail

      • 如果T是空数组:

        • 返回[]