2016-12-03 45 views
3

我試圖做到這一點在我的打字稿類:是否允許通過TypeScript中的其他字段進行字段初始化?

private _errorHappened = new Subject<SomeError>(); 
public errorHappened = this._errorHappened.asObservable(); 

我另一個領域的直列初始化過程中使用字段的值。提供的示例有效,如果我翻轉這兩行的順序,則會拋出Cannot read property 'asObservable' of undefined錯誤。這讓我認爲解析器自上而下處理類聲明,如果你引用了上面已經定義的字段,那麼這一切都很好。

我的問題是:這種行爲可信嗎?我的意思是,這是一種有記錄的行爲,或者它現在「行得通」,但不能保證在未來不會中斷?在其他一些語言中,這樣的初始化是不可能的(你必須使用構造函數)。在打字稿中這只是行嗎?你能鏈接到文檔中的相關部分嗎?

回答

3

TypeScript的精神將成爲帶有類型的JavaScript,但積極地將JavaScript管道中的新特性引入到TypeScript編譯器中。所以問題就變成了:在JavaScript proposal for public class fields中,字段可以在其初始化程序中使用前一個字段的值嗎?

答案是是的,至少,是的,因爲現在的情況。在建立this(這很重要,這意味着我們可以使用this)並且它們按照的順序運行之後運行實例(例如,非靜態)類字段初始值設定項。鏈接的草稿規範語言中的詳細信息。

請注意,此提案目前處於第2階段the process。這意味着它是草稿,草稿可以更改。但如果它的這一方面發生了變化,我會感到驚訝;它很有用,並與其他語言的行爲一致。

這就是說,如果你想成爲謹慎,你總是可以推遲初始化的構造器:

class Example { 
    private _errorHappened = new Subject<SomeError>(); 
    public errorHappened : /* ...some type here presumably...*/; 
    constructor() { 
     this.errorHappened = this._errorHappened.asObservable() 
    } 
}