LastIndexOf
大约 1 分钟TC-Medium
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
解答
思路
从后往前检查, 找到第一个匹配的元素即可. 俺们可以使用递归来实现这个功能.
俺们使用递归的方式来求解.
分为以下两种情况:
- (base case)
U
是T
的最后一个元素, 返回T
的length
- (recursive case)
U
不是T
的最后一个元素, 递归调用LastIndexOf<T[1..], U>
来查找 (这里的T[1..]
表示T
的子数组, 即去掉第一个元素后的数组)
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