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')
我想创建通用的类型化方法,该方法将按每个对象中动态 属性 名称下的数字对对象数组进行排序。
这是我目前的情况:
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')