【发布时间】:2021-08-27 20:00:08
【问题描述】:
扩展来自 Effective Typescript 的示例,我不知道我是否遇到了类型检查器或我的理解的限制。
这是第 33 页的原始示例
interface Point {
x: number
y: number
}
function sortBy<K extends keyof T, T>(vals: T[], key: K): T[] {
// ...
}
const pts: Point[] = [
{ x: 1, y: 1 },
{ x: 2, y: 0 },
]
console.log(sortBy(pts, "x"))
这是我尝试用有用的东西替换 //...
interface Point {
x: number
y: number
}
function sortBy<K extends keyof T, T>(vals: T[], key: K): T[] {
// my solution
return vals.sort((a, b) => {
return b[key] - a[key] // Error: The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.ts(2362)
})
// end my solution
}
const pts: Point[] = [
{ x: 1, y: 1 },
{ x: 2, y: 0 },
]
console.log(sortBy(pts, "x"))
但如果我替换为
return (b[key] as any) - (a[key] as any)
有效
我想不通的是,为什么类型检查器认为 a[key] 或 b[key] 可能不是数字,因为 a 和 b 必须是 Point 类型,而 key 必须是 keyof Point。
如果我在没有泛型的情况下编写它,它工作正常,这让我觉得这里发生了一些奇怪的事情。
function sortBy(vals: Point[], key: "x" | "y"): Point[] {
return vals.sort((a, b) => {
return b[key] - a[key]
})
}
【问题讨论】:
标签: typescript typescript-generics