【问题标题】:Extend index signature of interface扩展接口的索引签名
【发布时间】:2019-08-21 05:03:28
【问题描述】:

我正在尝试扩展具有索引签名的接口。但是,当添加具有不同类型的新属性时,旧的索引签名会导致错误。是否可以重新定义旧的索引签名?

interface A {
  a: number;
  b: string;
  [key: string]: number | string;
}

interface B extends A {
  c: Function;
}

错误:'Function' 类型的属性 'c' 不能分配给字符串索引类型 'string | number'.ts(2411)

【问题讨论】:

    标签: typescript


    【解决方案1】:

    如果B 扩展A,则意味着B 必须在接受A 的地方可用。

    通过“扩大”定义,并非B 的每个实例都与A 兼容,因此这是不允许的。

    通常,解决这类问题的关键是尽量避免使用索引签名。它经常被过度使用,几乎和any一样糟糕

    【讨论】:

      【解决方案2】:

      在 A 中,您对密钥制定了规则,因此 B 必须尊重它

      【讨论】:

        【解决方案3】:

        据我所知,如果您使用的是interface,则无法覆盖索引签名。您可以改用类型别名和交集,因为类型别名允许覆盖属性。

        您还需要打开--strictFunctionTypes 检查打字稿以使其工作。

        interface A {
          a: number;
          b: string;
          [key: string]: number | string;
        }
        
        type B = A & {
          c: Function;
        }
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-06
        • 2021-05-20
        • 2023-03-23
        • 2016-10-11
        • 1970-01-01
        • 2020-07-12
        • 2020-02-02
        • 1970-01-01
        相关资源
        最近更新 更多