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

TypeScript泛型实现:确定类型含指定键的属性抽象排序

实现类型安全的泛型排序函数

你需要的是一个泛型函数,能抽象排序依赖的属性键,同时保证类型安全——确保传入的键在目标类型中存在,且对应的值是可用于减法运算的数值类型。

原代码(固定属性版本)

interface Sorting {
  myValue: number
}

const mySort = (data: Sorting[]) => {
  data.sort((a: Sorting, b: Sorting) => {
    return a.myValue - b.myValue
  })
  return data
}

泛型实现方案(类型安全)

下面提供两种实现方式,第二种的类型约束更严格:

方案1:基础泛型约束

const mySort = <T, K extends keyof T>(data: T[], key: K): T[] => {
  // 类型断言确保属性值为number,适配已知数值类型的场景
  data.sort((a, b) => (a[key] as number) - (b[key] as number))
  return data
}

方案2:严格类型约束(推荐)

直接通过泛型约束,限定传入的键对应的属性必须是number类型,无需额外断言:

const mySortStrict = <T extends Record<K, number>, K extends string>(data: T[], key: K): T[] => {
  data.sort((a, b) => a[key] - b[key])
  return data
}

使用示例

interface Sorting {
  myValue: number
  otherProp: string
}

const testData: Sorting[] = [
  { myValue: 5, otherProp: "b" },
  { myValue: 2, otherProp: "a" },
  { myValue: 8, otherProp: "c" }
]

// 正确调用:只能传入'myValue',因为'otherProp'是string类型,不符合约束
const sortedResult = mySortStrict(testData, 'myValue')

说明

  • K extends keyof T 确保key是T类型中存在的属性键;
  • T extends Record<K, number> 进一步约束T中K对应的属性值必须是number,从根源避免非数值类型参与减法运算的错误;
  • 调用时TypeScript会自动校验传入的键是否合法,完全实现类型安全。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 06:28:15