题目描述
实现一个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