如何在TypeScript中编写LastElementOf类型获取元组最后元素类型
实现TypeScript的LastElementOf类型获取元组最后一个元素类型
要实现LastElementOf<T>类型,我们可以利用TypeScript的条件类型和元组类型推断特性,区分处理具体元组和普通数组两种场景:
定义LastElementOf类型
type LastElementOf<T extends unknown[]> = T extends [...infer _, infer Last] ? Last : T[number];
类型逻辑说明
- 针对具体元组:
[...infer _, infer Last]会将元组的所有前置元素匹配到占位符_(表示无需使用的类型),仅提取最后一个元素的类型到Last,最终返回Last。 - 针对普通数组:如果传入的是普通数组类型(如
string[]、unknown[]),无法匹配元组的展开模式,此时返回T[number](即数组的元素类型)。
结合你的takelast函数使用
假设ParamType<T>和unparam有如下示例实现,完整代码如下:
// 示例类型与工具函数(可替换为你的实际实现) type ParamType<T> = { value: T }; function unparam<T>(obj: ParamType<T>): T { return obj.value; } // 定义LastElementOf类型 type LastElementOf<T extends unknown[]> = T extends [...infer _, infer Last] ? Last : T[number]; // 实现takelast函数 function takelast<T extends unknown[]>( ...input: { [index in keyof T]: ParamType<T[index]> } ): LastElementOf<T> { // 类型断言确保编译器识别返回值类型 return unparam(input[input.length - 1]) as LastElementOf<T>; }
测试用例验证
// 元组场景:返回最后一个元素的类型number const numResult = takelast({ value: 'hello' }, { value: true }, { value: 42 }); // numResult 类型为 number // 普通数组场景:返回元素类型string const strResult = takelast(...[{ value: 'a' }, { value: 'b' }, { value: 'c' }] as ParamType<string>[]); // strResult 类型为 string
内容的提问来源于stack exchange,提问作者user8649828
相关产品推荐
相关产品推荐

