【发布时间】:2021-08-24 03:48:55
【问题描述】:
我正在尝试实现此处概述的多维数组排序功能: https://stackoverflow.com/a/55620991/2175753
它并不过分复杂,但是函数的类型设置让我头疼。
这是我目前所拥有的:
export function orderBy<T, U extends keyof T>(array: Array<T>, keys: Array<U>, sort: (key: U, a: T[U], b: T[U]) => number) {
const records = keys.map(key => {
const record = {
key,
uniques: Array.from(new Set(array.map(item => item[key])))
}
record.uniques = record.uniques.sort((a, b) => sort(key, a, b))
return record
})
const weightOfObject = (obj: T) => {
let weight = ''
records.map(record => {
let zeropad = `${record.uniques.length}`.length
weight += record.uniques.indexOf(obj[record.key]).toString().padStart(zeropad, '0')
})
return weight
}
return array.sort((a, b) => weightOfObject(a).localeCompare(weightOfObject(b)))
}
在调用站点上,它看起来像这样:
问题是,我无法进一步缩小 a 和 b 的类型。 我希望这会起作用:
我尝试调整函数签名以明确表示回调是通用的,如下所示:
export function orderBy<T, U extends keyof T>(array: Array<T>, keys: Array<U>, sort: <V extends U>(key: V, a: T[V], b: T[V]) => number) { ... }
但无济于事。
这是 TypeScript 不支持的东西还是我做错了什么?
【问题讨论】:
标签: typescript typescript-typings typescript-generics