如何在TypeScript中实现仅接受数值类型属性的sortBy函数
实现类型安全的
sortBy函数 需求:编写一个sortBy函数,接收T类型的数组以及用于排序的T类型属性键,仅允许传入对应值为数值类型的属性键。
初始实现的不足
目前有如下基础实现,但无法限制Key类型,使得T[Key]必须指向数值类型:
const sortBy = <T, Key extends keyof T>(items: T[], key: Key) { // 实现逻辑 }
尝试过的无效类型定义
曾尝试编写以下类型,但未达到预期效果:
type NumericAttributesOf<T> = { [K in keyof T]: T[K] extends number ? T[K] : never }
最终解决方案
通过构造筛选属性键的工具类型,结合函数重载完成了类型安全的实现:
// 工具类型:筛选出T类型中值为V类型的所有属性键 type KeysMatching<T, V> = { [K in keyof T]: T[K] extends V ? K : never }[keyof T] // 函数重载:确保输入输出的类型一致性 function sortBy<T>(items: T[], key: KeysMatching<T, number>): T[] function sortBy<K extends PropertyKey>( items: Record<K, number>[], key: K, ): Record<K, number>[] { return [...items].sort((a, b) => a[key] - b[key]) }
内容的提问来源于stack exchange,提问作者DiegoFrings
相关产品推荐
相关产品推荐

