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
相关产品推荐
相关产品推荐

