interface I {
readonly x: boolean
}
class C implements I {
constructor(public x: boolean) {}
}
const c = new C(false);
c.x = true;
我希望
tsc
会在这里抱怨C
没有实现I
,因为C.x
不是readonly
,或者抱怨我无法设置c.x
,因为它是 readonly
字段。这是什么原因?
在这方面,您可以放宽属性定义,这就是这里发生的情况。您已通过在构造函数参数列表中使用
I
覆盖了 public x: boolean
的定义。你已经有效地写了:
interface I {
readonly x: boolean
}
class C implements I {
public x: boolean; // <=== Overriding declaration
constructor(x: boolean) {
this.x = x;
}
}
const c = new C(false);
c.x = true;
x
中的C
不是readonly
,尽管x
中的I
是,因为C
中的声明会覆盖I
中的声明。
要解决这个问题,我认为除了重复它之外你没有太多选择:
interface I {
readonly x: boolean
}
class C implements I {
constructor(public readonly x: boolean) { }
// ^^^^^^^^
}
const c = new C(false);
c.x = true; // Error now