扩展接口的索引签名

时间:2019-03-30 12:04:18

标签: typescript

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

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

interface B extends A {
  c: Function;
}

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

3 个答案:

答案 0 :(得分:1)

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

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

通常,解决此类问题的关键是尝试避免使用索引签名。它经常被过度使用,几乎与any

一样糟糕

答案 1 :(得分:0)

在A中,您为密钥制定了规则,因此B必须遵守它。

答案 2 :(得分:0)

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

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

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

type B = A & {
  c: Function;
}