繁体   English   中英

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

[英]Typescript - generic sort array of objects by dynamic property name

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

这是我到目前为止所拥有的:

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的类型作为文字类型,然后使用 object 类型的约束T ,其中包含一个类型number的 prop K

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')

操场

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM