【发布时间】:2021-10-11 21:15:52
【问题描述】:
让我们看看这段代码
interface ImmutableValue<T> {
readonly value: T;
}
let i: ImmutableValue<string> = { value: "hi" };
i.value = "Excellent, I can't change it"; // compile-time error
以上内容非常简单,我们有一个接口ImmutableValue,由于i 正在实现该接口,i.value 将得到编译错误
现在考虑下面的代码
interface Greetable {
readonly name: string;
}
class Person implements Greetable {
name: string;
constructor(n: string) {
this.name = n;
}
}
let user1 = new Person('isaac');
user1.name = 'jon'
console.log(user1)
对于上面的代码,显然Person 正在实现Greetable,它的name 和readonly 和user1.name = 'jon' 是一个值重新分配,我们应该得到一个错误。但是 TS 编译得很好,知道为什么吗?
【问题讨论】:
-
Person extends Greetable,包括允许写名字。
-
@jonrsharpe:我不认为我们可以
extends一个接口.. -
我不是指
extends,我指的是添加行为。任何需要 Greetable、具有可读名称属性的东西,仍然可以使用 Person。他们无法通过该接口进行写入,另一个消费者通过 Person 可能访问相同值的事实是无关紧要的。
标签: javascript typescript oop interface