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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 08:18:25