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

如何在TypeScript中为排序函数强制属性的数值类型约束?

解决TypeScript中对象数组按数值属性排序的编译时类型约束问题

你可以通过泛型约束实现编译时类型检查,确保传入的prop对应的属性值是数值类型。以下是两种可行的写法:

写法1(TypeScript 4.9+支持)

function sortByProperty<T, K extends keyof T>(arr: T[], prop: K): T[]
where T[K] extends number {
    return arr.sort((a, b) => a[prop] - b[prop]);
}

写法2(兼容旧版本TypeScript)

function sortByProperty<T extends Record<K, number>, K extends keyof T>(arr: T[], prop: K): T[] {
    return arr.sort((a, b) => a[prop] - b[prop]);
}

使用示例

  • 合法调用(属性为数值类型):
interface User {
    name: string;
    age: number;
}

const users: User[] = [{name: "Alice", age: 30}, {name: "Bob", age: 25}];
const sortedUsers = sortByProperty(users, "age"); // 编译正常通过
  • 非法调用(属性为非数值类型):
sortByProperty(users, "name"); // 编译报错:类型'string'无法赋值给类型'number'

原理说明

通过泛型参数K锁定属性名,同时约束T中K对应的属性类型必须为number。TypeScript会在编译阶段直接拦截传入非数值属性的操作,无需等到运行时再做校验,从源头避免了属性类型不匹配导致的排序逻辑错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 18:01:25