如何在TypeScript中复用排序方法处理含共同name属性的不同类型对象?
解决方案
要实现复用按name属性排序的方法,核心是通过泛型约束让方法支持所有包含string类型name属性的对象,同时避免any带来的类型不安全问题。以下是修改后的代码:
type ObjectA = { name: string ownPropertyA: object ownPropertyB: number } type ObjectB = { name: string ownPropertyE: object ownPropertyF: [] } const arrayOfObjectA: ObjectA[] = [ { name: 'Banana', ownPropertyA: {}, ownPropertyB: 0 }, { name: 'apple', ownPropertyA: {}, ownPropertyB: 1 } ] const arrayOfObjectB: ObjectB[] = [ { name: 'Orange', ownPropertyE: {}, ownPropertyF: [] }, { name: 'grape', ownPropertyE: {}, ownPropertyF: [] } ] const sortByNameResultOrder = { ascend: -1, descend: 1, equal: 0 } // 用泛型约束参数必须包含name:string属性 function _compareNames<T extends { name: string }>( a: T, b: T, sortOrderA: number, sortOrderB: number ) { const aName = a.name.toLowerCase() const bName = b.name.toLowerCase() if (aName < bName) { return sortOrderA } else if (bName < aName) { return sortOrderB } return sortByNameResultOrder.equal } // 泛型约束数组元素是带name:string的对象 function sortByName<T extends { name: string }>(array: T[]) { array.sort((a, b) => { return _compareNames(a, b, sortByNameResultOrder.ascend, sortByNameResultOrder.descend) }) } // 调用验证 sortByName(arrayOfObjectA) console.log(arrayOfObjectA) // 按name升序排列:apple, Banana sortByName(arrayOfObjectB) console.log(arrayOfObjectB) // 按name升序排列:grape, Orange
关键修改点
- 泛型约束替代any:将
_compareNames和sortByName的泛型约束为T extends { name: string },确保只有包含name字符串属性的对象才能传入,既保留类型安全,又实现复用。 - 修正数组类型定义:原代码
sortByName<T extends []>的约束错误,改为T extends { name: string }后,方法接收T[]类型的数组,符合实际使用场景。 - 移除冗余类型标注:排序回调中的
a: any, b: any可以省略,TypeScript会自动推导为T类型。
这样修改后,sortByName方法可以安全地给所有拥有string类型name属性的对象数组排序,不管对象其他属性是什么。
内容的提问来源于stack exchange,提问作者volna
相关产品推荐
相关产品推荐

