Yuzhe's Blog

yuzhes

LastIndexOf

LastIndexOf

题目

实现类型版本的 Array.lastIndexOf, LastIndexOf<T, U> 接受数组 T, any 类型 U, 如果 U 存在于 T 中, 返回 U 在数组 T 中最后一个位置的索引, 不存在则返回 -1

For example:

type Res1 = LastIndexOf<[1, 2, 3, 2, 1], 2>; // 3
type Res2 = LastIndexOf<[0, 0, 0], 2>; // -1

解答

思路

从后往前检查, 找到第一个匹配的元素即可. 俺们可以使用递归来实现这个功能.

::: tip

返回的下标是什么?

这基于俺们如何构造这个类型.

俺们这里使用取巧的办法, 即Tlength, 至于为什么, 请看下去. :::

俺们使用递归的方式来求解.

分为以下两种情况:

Solution

type LastIndexOf<T extends any[], U> = T extends [...infer I, infer L] ?
  IsEqual<L, U> extends true ?
  I['length'] :
  LastIndexOf<I, U> : -1

这里的IsEqual是一个工具类型, 用来判断两个类型是否相等, 请参考 IsEqual