TypeScript中实现接口的类不遵守readonly修饰符。

7

我希望创建一个基于接口的类,但是看起来好像不尊重只读修饰符。

以下代码可以正常工作,没有编译错误:

interface I {
  readonly a: string
}

class C implements I{
  a= ""
}
const D = new C
D.a = "something"

为了使属性'a'真正只读,我应该在类定义中也将其标记为只读!那么在接口定义中readonly修饰符的用例是什么呢? 换句话说,当我通过实现接口创建一个类时,如何确保我使用了正确的修饰符?
3个回答

1

您需要早期定义“D”的类型,注意我将“D”改为小写的“d”。

interface I {
  readonly a: string
}

class C implements I{
  a= ""
}
let d: I // THIS IS NEEDED
d = new C
d.a = "something" // NOW THIS WON'T WORK

没错,就是这个! - ebbishop

1
更令人担忧和惊讶的是,相反的情况也是正确的。具有只读属性的对象可以满足那个属性不是只读的对象类型。
我发现了这个问题: https://github.com/microsoft/TypeScript/issues/18770 它是公开的,这可能表明有兴趣以某种方式修复它,并且在某种程度上被认为是一个问题。

我在那个问题中添加了我的评论,希望他们能将其纳入他们的路线图。 - Saeid Ostad

0

readonly 关键字在接口中的主要思想是在声明接口类型的对象时进行约束。

interface ITest {
    readonly a: string;
}

const t: ITest = {
    a: 'readonly'
}

t.a = 'another value'; // -> Compiler error

当在类中实现一个接口时,该类必须重新声明属性的访问属性

interface ITest {
    readonly a: string;
    b: string;
    c: string;
}

class ATest implements ITest {
    a: string = ``;
    constructor(public b: string, public c: string) { }
}

const t = new ATest('b', 'c');
t.a = 'another value'; // This is OK

我理解您的意思,但回到我的问题,当我通过实现接口创建类时,如何确保我使用了正确的修饰符? - Saeid Ostad
正如我所指出的,类必须重新声明其属性的访问属性。接口到类之间没有属性访问器的继承。唯一的限制是从接口推断出的属性必须是公共的。 - VRoxa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接