2016-10-01 3 views
1

繰り返しコードをリファクタリングしようとしています。私は、Neo4jデータベース上のさまざまなタイプのノードを表すモデルクラスをたくさん持っています。クラスには、DB上のノードのタイプに対応するプロパティstatic label: stringがあります。このラベルを使用してノードを取得し、適切なタイプのインスタンスを作成したいと考えています。静的プロパティへのアクセスを持つ一般的なファクトリ関数を作成する

私は作品(この例では単純化)このようなものがあります:

class record { 
    public static label: string; 
    public id: number; 
} 

class RecordType extends record { 
    label = "Some_DB_Label"; 

    constructor(id: number) { 
     super() 
     this.id = id; 
    } 

} 

function DBService(klass) { 
    /* should work for all record subclasses each with different labels */ 
    let label = klass.label; 

    /* use label to make db query gettig 
     getting records of type $label */ 

    // create objects from returned information 
    let id = 10 //<- id from db 
    return new klass(id) 
} 

をこれのjavascriptの側が何らかのトラブルを持っていません - このコードは正常に動作します。私はちょうど:DBService(RecordType)を呼ぶことができ、オブジェクトを得る。しかし、私はすべてのタイプチェックを外しています。

汎用入力をDBServiceに追加したいと思います。

function DBServiceG<T>(klass: { new (id: number): T; }): Tが、その後私はもはや静的プロパティにアクセスすることができます:私は、このような一般的なため、署名にコンストラクタ関数を使用することができることを理解していません。静的プロパティをインスタンスの通常のプロパティにすることもできますが、インスタンスを作成して使用する必要があります。また、DBコールを作成するまではインスタンスを作成できません。

これは可能なようですが、わかりません。

答えて

2

私はそれは私が何かを明らかにしようとしていないために少し愚かな感じ

function DBService<T>(Class: { label: string, new (id: number): T }): T { 
    ... 
} 
+0

だと思います。ありがとうございました。 –

+0

あなたは大歓迎です。私はタイピングではあまり良くありませんが、これは確かに明らかでした。 – estus

関連する問題