2016-07-29 15 views
1

コードは以下の通りです:活字体相続財産

class BaseClass { 
    propertyA: KnockoutObservable<string> = ko.observable<string>(); 
    constructor(message: string) { 
     this.propertyA.subscribe((newValue)=>{ 
      console.log(newValue); // not run when change propertyA in ChildClassA instance. 
     }); 
    }  
} 
class ChildClassA extends BaseClass { 
    propertyA: KnockoutObservable<string> = ko.observable<string>(); //remove it, the issue is solved. 
} 

私はChildClassAがBaseClassのという名前と同じ性質を持っている場合、propertyAのサブスクリプション機能が実行されないことに気づきました。 ChildClassAの宣言行を削除して問題を解決します。

なぜですか?

答えて

3

これあなたがBaseClass

でそれを割り当てる後ChildClassAthis.propertyAを再割り当てされているので、JavaScriptにコンパイルするとコードがChildClassAをインスタンス化する場合

var BaseClass = (function() { 
    function BaseClass(message) { 
     this.propertyA = ko.observable(); 
     this.propertyA.subscribe(function (newValue) { 
      console.log(newValue); // not run when change propertyA in ChildClassA instance. 
     }); 
    } 
    return BaseClass; 
}()); 
var ChildClassA = (function (_super) { 
    __extends(ChildClassA, _super); 
    function ChildClassA() { 
     _super.apply(this, arguments); 
     this.propertyA = ko.observable(); //remove it, the issue is solved. 
    } 
    return ChildClassA; 
}(BaseClass)); 

playground

でそれを参照してくださいになっていますあなたはsuperと呼んでいますBaseClassのコンストラクタでthis.propertyAを割り当て、リスナーにサブスクライブします。ファイン。しかし右superを呼び出した後、あなたは

this.propertyA = ko.observable(); //remove it, the issue is solved. 

プロパティの初期化がsuperコールの後、コンストラクタに移動しているラインでChildClassAコンストラクタにthis.propertyAを再割り当てされています。

Typescriptでプロパティを(継承によって)オーバーライドすることはありません。