我认为这有一个很好的理由,但对我来说似乎很奇怪.请将以下代码作为问题的示例.
class Foo {
constructor(referenceMethod: () => void) {
}
}
class Bar extends Foo {
TestProperty: string = "boo";
constructor() {
super(this.ReferenceMethod);
}
ReferenceMethod() {
}
}
Run Code Online (Sandbox Code Playgroud)
这会产生编译器错误
'this'无法在当前位置引用.
如果我们初始化TestProperty构造函数内部,编译器很高兴并且世界按预期旋转,当然如果我们不将referenceMethod的引用传递给超级调用,我们可以在构造函数外部设置TestProperty.
但是我只是不明白为什么一起做这两件事会导致问题.如果有人能够阐明这一点,以帮助我的理解将不胜感激.
从Typescript语言规范的 8.3.2开始:
如果以下两个条件都成立,则构造函数体中的第一个语句必须是超级调用:1.包含类是派生类.
2.构造函数声明参数属性或包含类使用初始值设定项声明实例成员变量.
示例中的包含类声明了一个TestProperty使用初始化程序的变量:
TestProperty: string = "boo";
Run Code Online (Sandbox Code Playgroud)
您看到错误的原因是编译器要求第一行constructor调用给super定类的当前布局(上面的语言规范中的#2).因此,这意味着当您开始引用类的属性时,类未完全初始化,例如TestProperty.虽然ReferenceMethod会被初始化并且可用,但成员变量仍然不会,这可能会破坏您班级中的其他功能.
虽然语言作者可以生成可以避免此问题的工作代码,但当它以您找到的方式工作时,它显然更容易且更一致.
作为替代方案,initialize一旦构造函数完全初始化类,您可以尝试添加一个执行相同逻辑的方法.这无疑是第二步,但它适用于TypeScript.但是,请注意确保在构造函数初始化成员变量之后调用initialize.
| 归档时间: |
|
| 查看次数: |
2564 次 |
| 最近记录: |