首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展接口的索引签名

扩展接口的索引签名
EN

Stack Overflow用户
提问于 2019-03-30 20:04:18
回答 3查看 1.2K关注 0票数 0

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

代码语言:javascript
复制
interface A {
  a: number;
  b: string;
  [key: string]: number | string;
}

interface B extends A {
  c: Function;
}

错误:'Function‘类型的属性'c’不可分配给字符串索引类型'string |number‘。is (2411)

EN

回答 3

Stack Overflow用户

发布于 2019-03-31 00:01:08

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2019-03-30 20:14:05

在A中,你对钥匙制定了一条规则,所以B必须遵守它

票数 1
EN

Stack Overflow用户

发布于 2019-03-30 23:56:19

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

您还需要打开typescript的--strictFunctionTypes检查才能使其正常工作。

代码语言:javascript
复制
interface A {
  a: number;
  b: string;
  [key: string]: number | string;
}

type B = A & {
  c: Function;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55431255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档