2017-11-07 15 views
1

I飾らモデルクラスがあります。typescriptでジェネリック型のメタデータを取得できますか?

@Api('payments/deposit') 
export class DepositsModel { 
    public id: number; 
    public created_at: Date; 
    ... 

角度成分のコンストラクタで、私は私のモデルクラスを使用するように指してデータサービスを注入していた:

... 
public constructor( 
    private $api: GridApiService<DepositsModel> 
... 
) { 
    this.service = new GridService($api); 
    ... 
} 
... 

だから、私のクールなコンポーネントはクールなサービスを持って、魔女は、それが私の中で、モデルのメタデータを取得すると...

...知っているが、どのように私ができるべき作業データの種類を知っている私GridApiService?

@Injectable() 
export class GridApiService<T>{ 
    constructor(
    $http: HttpClient, 
) { 
    let api = Reflect.getMetadata('Api', T); 
    } 

をそしてエラーメッセージました:私が試した「T」だけで型を参照するが、ここでの値として使用されています。

UPDATE

あなたが私に私GridApiServiceに初期化データを渡すために別の方法をアドバイスすることができ、魔女は新しいキーワードで作成されていない、DIを介して注入されなければなりませんか?

答えて

5

TypeScript型は実行時には存在しませんが、クラスデコレータを介してメタデータとして出力できるものは例外です。汎用タイプcannot be emittedであり、角度DIには存在しません。 GridApiService<DepositsModel>はタイプチェック以外の問題ではありません。

GridApiServiceDepositsModelとの間の接続は、例えば、継承のために、クラスのデザインで表現する必要があります。

class DepositsGridApiService extends GridApiService { 
    Model = DepositsModel; 
} 
+0

いや、私はサービスのホードを生成するが、普遍的なものを持っていないための方法を探していました... –

+0

あなたはフレームワークの機能から進んでいく必要があり、フレームワークはそういうものを提供しません。インジェクタごとに複数の種類のGridApiService がある場合は、サブクラス化するか、またはT引数でインスタンス化されたファクトリ関数またはラッパークラスを注入する必要があります。これは潜在的なXYの問題であり、あなたがしようとしているものと望ましい解決策が異なる場合があります。そして、AOTもいくつかの制限を課すでしょう。 – estus

関連する問題