【问题标题】:Property does not exist on generic type T泛型类型 T 上不存在属性
【发布时间】:2020-11-07 12:46:52
【问题描述】:

我不明白下面出现的错误

这是一个最小的可重现示例

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

【问题讨论】:

    标签: typescript generics typescript-typings


    【解决方案1】:
    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
    }
    

    Playground

    【讨论】:

      猜你喜欢
      • 2020-10-07
      • 2021-08-26
      • 2019-12-09
      • 2020-03-29
      • 1970-01-01
      • 2015-11-18
      • 1970-01-01
      • 1970-01-01
      • 2016-05-13
      相关资源
      最近更新 更多