Typescript - 按动态 属性 名称对对象数组进行通用排序

Typescript - generic sort array of objects by dynamic property name

我想创建通用的类型化方法,该方法将按每个对象中动态 属性 名称下的数字对对象数组进行排序。

这是我目前的情况:

export const sortByNumber = <T, K extends keyof T>(
  items: T[],
  dateFieldName: K,
) => items.sort((a: T, b: T) => a[dateFieldName] - b[dateFieldName])

此方法的问题在于,在 items.sort 中,当我减去 a[...] - b[...] 时,编译器告诉我这些应该是数字。我同意,但如何在方法定义中指定它?

我想要实现的示例:

const iWantToSortThis = [
    { name: 'some', example: 3 }, 
    { name: 'name', example: 1 }, 
    { name: 'whatever', example: 2 }
]

sortByNumber(iWantToSortThis, 'example') // gets sorted nicely

还有

const anotherArrayToSort = [
    { name: 'some', prop: 'abc', anotherExample: 3 }, 
    { name: 'name', prop: 'xyz', anotherExample: 1 }, 
    { name: 'whatever', prop: 'asd', anotherExample: 2 }
]

sortByNumber(anotherArrayToSort, 'anotherExample') 
// also gets sorted nicely even though objects have different 
// shape and fieldName is different then in first example.

反过来,首先获取 dateFieldName 的类型作为文字类型,然后约束 T 对象类型包含一个 prop K 类型 number

export const sortByNumber = <K extends string, T extends Record<K, number>>(
  items: T[],
  dateFieldName: K,
) => items.sort((a: T, b: T) => a[dateFieldName] - b[dateFieldName])

const iWantToSortThis = [
    { name: 'some', example: 3 }, 
    { name: 'name', example: 1 }, 
    { name: 'whatever', example: 2 }
]

sortByNumber(iWantToSortThis, 'example')

Playground