TypeScript如何实现类型安全的对象数组排序函数?
类型安全的对象数组排序函数实现(无类型断言/宽松索引)
要实现仅允许传入对象现有number类型键的类型安全排序函数,核心是通过泛型+条件类型约束精准限定参数范围,既避免宽松索引签名的风险,也无需手动类型断言。
步骤1:定义工具类型(可选但更清晰)
先封装一个工具类型,提取对象中值为number类型的键:
type NumberKeys<T> = { [P in keyof T]: T[P] extends number ? P : never }[keyof T];
这个类型会遍历对象的所有键,只保留对应值是number的键。
步骤2:实现泛型排序函数
基于工具类型实现排序函数,TypeScript会自动推断键对应值的类型:
function sortByNumberKey<T>( arr: T[], key: NumberKeys<T>, order: 'asc' | 'desc' = 'asc' ): T[] { // 先复制数组避免修改原数据 return [...arr].sort((a, b) => { const valA = a[key]; const valB = b[key]; // 此处TypeScript已明确valA/valB是number,无需断言 return order === 'asc' ? valA - valB : valB - valA; }); }
步骤3:测试使用(以你的BaseHighLightsRes为例)
// 定义你的业务接口 interface BaseHighLightsRes { id: number; score: number; title: string; // 非number类型的键,用于测试类型校验 } // 测试数据 const highlights: BaseHighLightsRes[] = [ { id: 2, score: 88, title: "Article B" }, { id: 1, score: 95, title: "Article A" }, { id: 3, score: 90, title: "Article C" } ]; // 合法调用:传入number类型的键 const sortedByScore = sortByNumberKey(highlights, 'score', 'desc'); const sortedById = sortByNumberKey(highlights, 'id'); // 类型报错:传入非number类型的键(title对应string) const invalidSort = sortByNumberKey(highlights, 'title');
方案优势
- 严格类型校验:仅允许传入对象中存在且值为
number的键,杜绝非法键传入 - 无类型断言:通过泛型约束让TypeScript自动推断值类型,避免
as number的潜在风险 - 不破坏原有接口:无需给
BaseHighLightsRes添加宽松的索引签名,保留接口的精准定义
内容的提问来源于stack exchange,提问作者JJAHMEDAMER
相关产品推荐
相关产品推荐

