如何解决Typescript - 按动态属性名称对对象进行通用排序数组
我想创建通用的类型化方法,该方法将按每个对象中动态属性名称下的数字对对象数组进行排序。
这就是我现在所拥有的:
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 },prop: 'xyz',anotherExample: 1 },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
,对象类型包含一个类型为 K
的 prop 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')
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。