2016-12-03 10 views
3

私は私の活字体のクラスでこれをやろうとしている:TypeScriptの別のフィールドによるフィールドの初期化は許可されていますか?

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

私は別のフィールドのインライン初期化中にフィールドの値を使用しています。提供されている例が動作し、その2行の順序を反転すると、エラーCannot read property 'asObservable' of undefinedがスローされます。これはパーサーがクラス宣言をトップダウンで処理すると思うし、上ですでに定義されているフィールドを参照するとすべてが良いということです。

私の質問です:この動作は信頼できるのですか?つまり、これは文書化された動作ですか、それとも今は「うまく動作していますが、将来は中断しないことは保証されていませんか?このような初期化はできません(コンストラクタを使用する必要があります)。これはタイスクリプトでは問題ありませんか?ドキュメントの関連セクションにリンクできますか?

答えて

3

TypeScriptのエートスは、型を持つJavaScriptですが、TypeScriptコンパイラのJavaScriptパイプラインにある新しい機能を積極的に採用することです。したがって、質問は次のようになります。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() 
    } 
} 
関連する問題