泛型类型T上不存在属性



我不明白以下的错误

以下是一个可重复性最小的示例

type Left = {
element: 0
}
type Right = {
element: 1
}
interface Typings {
"left": Left
"right": Right
}
function foo<T extends keyof Typings>(obj: T) {
console.log(obj.element)
// ^^^^^^^
// Property 'element' does not exist on type 'T'.
}

当然我仍然可以复制粘贴我的功能

function fooLeft(obj: Left) {
console.log(obj.element)
}
function fooRight(obj: Right) {
console.log(obj.element)
}

它工作得很好,但看起来不干净。。。如何避免复制粘贴我的函数?

我不能使用并集,在实际代码中,几个参数取决于Typings

keyof Typings

这意味着字符串"left" | "right"Typings键。您似乎想要属性的类型,而不是Left | Right

为此,您希望T是其所有属性的并集类型。您可以通过使用该类型自己的所有键对其进行索引来实现这一点。

function foo<T extends Typings[keyof Typings]>(obj: T) {
console.log(obj.element) // obj is: Left | Right
}

游乐场

最新更新