[TypeScript] Type Challenges #15 - Last of Array

55 阅读1分钟

题目描述

实现一个Last<T>泛型,它接受一个数组T并返回其最后一个元素的类型。

例如

type arr1 = ['a', 'b', 'c']
type arr2 = [3, 2, 1]

type tail1 = Last<arr1> // 应推导出 'c'
type tail2 = Last<arr2> // 应推导出 1

题解

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

type cases = [
  Expect<Equal<Last<[2]>, 2>>,
  Expect<Equal<Last<[3, 2, 1]>, 1>>,
  Expect<Equal<Last<[() => 123, { a: string }]>, { a: string }>>,
]


// ============= Your Code Here =============
type Last<T extends unknown[]> = T extends [...unknown[], infer Tail] ? Tail : never

使用T extends unknown[]对传入的类型参数T进行约束,确保T是一个数组类型

T extends [...unknown[], infer Tail]

  • ...unknown[]:使用...剩余参数的语法,表示数组的前面部分可以是零个或多个unknown类型的元素
  • 使用infer Tail去推断最后一个元素的类型,并存储在Tail

如果T是一个非空数组,返回最后一个元素的类型Tail,否则返回never