type-challenges:Last of Array

35 阅读1分钟

Last of Array

问题描述

在此挑战中建议使用TypeScript 4.0

实现一个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 =============
// 答案1
type Last<T extends unknown[]> = T extends [...infer rest, infer R] ? R : never
// 答案2
type Last<T extends unknown[]> = T extends [...unknown[], infer R] ? R : never
// 答案3
type Last<T extends any[]> = [any, ...T][T['length']]
​

这应该是一道简单题,做过 First of Array 这道题,应该就可以想到,使用 infer 关键字,将元组中的最后一项存在泛型变量中返回即可。这里 答案1 和 答案2 实际上没什么差别,我们不关心数组的前半段什么类型,只关心最后一个元素的类型,这里的答案3很巧妙,T['length'] 获取当前传入的泛型数组 T 的长度,使用 [] 下标索引的方式取到数组 [any, ...T] 的最后一个值。