You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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');

方案优势

  1. 严格类型校验:仅允许传入对象中存在且值为number的键,杜绝非法键传入
  2. 无类型断言:通过泛型约束让TypeScript自动推断值类型,避免as number的潜在风险
  3. 不破坏原有接口:无需给BaseHighLightsRes添加宽松的索引签名,保留接口的精准定义

内容的提问来源于stack exchange,提问作者JJAHMEDAMER

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:27:39