2017-06-01 1 views
1

は、私は、共通の祖先を持ついくつかのクラス、静的配列のプロパティを持つ各があります。TypeScriptで静的配列プロパティをスーパークラスに移動するにはどうすればよいですか?

class Foo extends Base { 
    static ary = []; 
} 

class Bar extends Base { 
    static ary = []; 
} 

をそしてaryの変更はBase内から完全に処理されているので、私はまたBaseに配列定義を移動したいと思います。

しかし、私は私のコードを変更する場合:その後、

class Base { 
    static ary = []; 
} 

class Foo extends Base { 
} 

class Bar extends Base { 
} 

BaseFooBarは明らかに同じ配列インスタンスを共有します。

aryを、各サブクラスが独自のインスタンスを参照して独自のプロパティを持つように定義する方法を教えてください。


私の現在の回避策は、次のようになります。

class Base { 
    private static _ary: Array<any>; 
    static get ary(): Array<any> { 
    if (!this.hasOwnProperty('_ary')) { 
     this._ary = []; 
    } 
    return this._ary; 
    } 
} 

class Foo extends Base { 
} 

class Bar extends Base { 
} 

Foo.ary.push(1, 2, 3); 
Bar.ary.push(4, 5, 6); 

Foo.ary; // [1, 2, 3] 
Bar.ary; // [4, 5, 6] 

が、(a)は、それが私有財産_aryを含み、(b)はaryゲッターがごとに呼び出されるためには、かなり面倒に感じています時間aryにアクセスしましたが、そのコードを実行する必要がありますが、は1回、サブクラスごとにです。しかし、あなたはaryを受け入れる場合、代わりの方法であることを - - あなたが指定したとおりに

答えて

1

ないあなたは、このような必要な動作を実装することができます

class Base 
{ 
    private static allAry = {}; 

    static ary(cls): Array<any> 
    { 
     let result = Base.allAry[cls.name]; 

     if (!result) 
     { 
      result = []; 
      Base.allAry[cls.name] = result; 
     } 

     return result; 
    } 
} 

class Foo extends Base 
{ 
    public static a() 
    { 
     Foo.ary(this).push(1); 
     console.log(Foo.ary(this).length); 
    } 
} 

class Bar extends Base 
{ 
    public static b() 
    { 
     Bar.ary(this).push(1); 
     console.log(Bar.ary(this).length); 
    } 
} 

Foo.a(); // Prints 1 
Bar.b(); // Prints 1 
+0

おかげで、私はすでに回避策に類似を持っている(私が更新しました私の質問)。配列/メソッドがアクセスされるたびに毎回その論理を実行する方法はありますか? – Stefan

関連する問題