我正在尝试扩展具有索引签名的接口。但是,添加具有不同类型的新属性时,旧的索引签名会导致错误。是否可以重新定义旧的索引签名?
interface A {
a: number;
b: string;
[key: string]: number | string;
}
interface B extends A {
c: Function;
}
错误:类型'Function'的属性'c'无法分配给字符串索引类型'string |数字'.ts(2411)
答案 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;
}