为什么在仅定义getter时不设置属性会生成typescript编译器错误?

时间:2016-02-19 21:08:00

标签: typescript

给出以下代码:

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时我试图分配给一个属性,那么就可以节省一些浪费的精力。

2 个答案:

答案 0 :(得分:1)

不创建setter并不意味着你无法设置它。这意味着它将在没有setter的情况下进行设置。当你不给它修饰符时,TypeScript就像JavaScript一样。

此外,你不能公开getter和setter私有。请参阅Private setter typescript?感谢评论中关于该信息的日期。

https://github.com/Microsoft/TypeScript/issues/12

跟踪此问题存在问题

答案 1 :(得分:0)

仅仅因为它定义为getter并不意味着你不能设置返回值。返回值后,在返回后将其更改为“hello”,这是合法的。

您使用此语句正在更改对象中的实际值。您会注意到,如果在此语句之后再次调用getter,它将返回您在setter中或在对象实例化时定义的值。

你应该阅读更多关于getter和setter方法的目的,以了解它们是什么以及为什么(以及何时!)它们被使用,因为它是面向对象编程的一个绝对重要的概念