[英]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.