データモデルを表す抽象クラスがあります。 Modelと呼んでみましょう。 ModelData型で実際にパラメータ化されています。これはモデルが実際に持つデータの種類を表します。したがって:Typescript:コンストラクタのハッシュ
export interface ModelData { type: string; attributes: {} }
export class Model<D extends ModelData> {}
export interface UserData extends ModelData
{ type: 'users', attributes: { name: string; }}
export class Users extends Model<UserData> {}
問題はモデルコンストラクタのリポジトリを維持したいということです。私のデータストアが私に{ type: 'users', id: 1 }
のような参照のリストを送ったとき、私はrefs.map(v => new ctors[v.type]({id: v.id}))
かそのようなことをすることができるのが好きです。
問題は、私は、このオブジェクトは、サブクラスのコンストラクタの文字列のインデックス付きセットが含まれています」と宣言するのか分からないということである。
私は
private types: { [type: string]: typeof Model }
、その後
find<T extends ModelData>(ref: ModelReference): Model<T> {
return new types[ref.type]({id: ref.id})
}
を行うために使用
多かれ少なかれ(簡略化のため、ヌルガードとその他のコードは省略されています)
これは実際には正しくありません。私が実際に返すものはextends Model<T>
です。タイプに格納されているものはtypeof Model
ではなく、extends typeof Model
です。
2.4.1より前(暗黙的な一般的な変更に関係していると仮定します)、正しいコードではないにもかかわらず、コードをコンパイルしました。私はとを作ることに満足していますが、私は実際にタイプスクリプトを使ってこれをどのように表現できるかはわかりません。
具体的には、ModelData
タイプのセットがあります。このタイプは、ModelDataの属性とリレーションシッププロパティとは異なるシェイプと、それぞれのModelDataタイプのModelを拡張するクラスのセットです。したがって、技術的にはモデルを返すことができますが、私はユーザーにいくつかの便利なメソッドを追加することができるので、ユーザーを返すことになります。
だから、それは 『「この事は、コンストラクタの文字列インデックスグループが含まれ、これらすべてのコンストラクタがパターンに従う』 AbstractClassを拡張し、言うことが可能である
ええと、これは私が必要とするものに非常に近くなります。型変数をインスタンス変数として使用する方法はありますか? 'find'を実行できますか? (それは箱から出なかった)。これにより、私のデータストアのサブクラスで実際の型を実際に定義することができます(データストアは汎用で、サブクラスは具体的なプロジェクト固有のデータ型を追加します) –
pfooti
'this [type ']の代わりに' this' 'しかし、私は' this'多型がこれを上回るかもしれないと思う。あなたのクラス名が 'DataStore'で' types'プロパティがある場合、 'typeof this.types'の代わりに' DataStore ['types'] 'を使うことができます。 – jcalz