2017-12-16 6 views
0
import Collection from 'collection' 

class Model { 
} 

class Book extends Model { 
    static collection = new Collection<Book>('books') 
} 

を取得し、私はモデルにブックからコレクション定義を移動したいと思います:typescriptですが、静的メソッドでは、このTYPEOF

import Collection from 'collection' 

class Model { 
    static _collection 

    static get collection() { 
     let typename = this.name // = Book 
     if(!this._collection) { 
      this._collection = new Collection<...>('books') 
     } 
     return this._collection 
    } 
} 

class Book extends Model { 
} 

私がして、親クラス(モデル)内のクラス名(ブック)を取得することができますthis.nameを使用してください。しかし、それを使用する書籍のタイプをnew Collection<>とどのように参照できますか?

答えて

1

コレクションメンバーは、スタティックです。静的メンバーは常にタイプに属しているため、コレクションを基底タイプModelに移動すると、Modelのすべてのサブタイプは基本的に同じコレクション(Modelで宣言されたもの)を使用します。

Modelのすべてのサブタイプが同じコレクションを使用するのであれば、それはそれは実際にCollection<Model>ときBook.collectionのタイプはCollection<Book>も持ってしても意味がありません。

ここで達成しようとしていることを考えてみることをお勧めします。通常、静的メンバーは最良のアイデアではない可能性があります。すべてが言われている


コレクションは静的メンバーではなかった場合、あなたはまだここに概念的な問題を持っているでしょう:静的型付けのポイントはコンパイル時で型情報を持っていることです。 JavaScriptにコンパイルすると、そのコレクションはまったく型付けされず、コンパイル時にまだ存在する型情報も強制されません。

そのため、実行時にのみ存在するタイプ情報は使用できません。そしてthis.nameはコンパイル時に評価されます。コンパイラにとってこれがBookであり、その型のコレクションであるということは実際にはありません。

可変型サポートのソリューションは、コレクションと同じようにジェネリックです。あなたは変数の型を持っていたModel内側部材を望むのであれば、あなたはModelがジェネリックにする必要があります:

class Model<T> { 
    private _collection : T[]; 

    public get collection() { 
     if (!this._collection) { 
      this._collection = new Collection<T>(); 
     } 
     return this._collection; 
    } 
} 

class Book extends Model<Book> { … } 

今すぐ Bookは、コンパイル時に利用可能 Collection<Book>メンバーを、持っているでしょう。

関連する問題