为什么只读从 TypeScript 接口中被删除?

问题描述 投票:0回答:1
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
字段。这是什么原因?

typescript readonly
1个回答
1
投票

在这方面,您可以放宽属性定义,这就是这里发生的情况。您已通过在构造函数参数列表中使用

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

游乐场链接

© www.soinside.com 2019 - 2024. All rights reserved.