给出以下代码:
class foo {
protected mBar: string;
public get Bar(): string {
return this.mBar;
}
}
function foobar(): void {
var myFoo: foo = new foo();
myFoo.Bar = "hello";
}
foobar();
为什么行myFoo.Bar = "hello";
不会产生编译错误?我希望编译器出错,因为foo只定义了一个get Bar()但是 NOT 一个set Bar()。相反,编译器什么也没说,结果javascript运行,但是无声地失败。编译器或运行时没有指示setter没有按预期工作。打字稿编译器不应该标记这种情况吗?
编辑:只是为了提供一些背景,这是偶然发生的。我忘了定义setter,然后浪费了一点时间试图弄清楚为什么我的任务没有按预期工作。如果编译器只是抱怨说当我没有定义setter时我试图分配给一个属性,那么就可以节省一些浪费的精力。
答案 0 :(得分:1)
不创建setter并不意味着你无法设置它。这意味着它将在没有setter的情况下进行设置。当你不给它修饰符时,TypeScript就像JavaScript一样。
此外,你不能公开getter和setter私有。请参阅Private setter typescript?感谢评论中关于该信息的日期。
跟踪此问题存在问题答案 1 :(得分:0)
仅仅因为它定义为getter并不意味着你不能设置返回值。返回值后,在返回后将其更改为“hello”,这是合法的。
您使用此语句不正在更改对象中的实际值。您会注意到,如果在此语句之后再次调用getter,它将返回您在setter中或在对象实例化时定义的值。
你应该阅读更多关于getter和setter方法的目的,以了解它们是什么以及为什么(以及何时!)它们被使用,因为它是面向对象编程的一个绝对重要的概念