web-dev-qa-db-ja.com

Typescriptのジェネリックメソッド内のTのタイプを取得するにはどうすればよいですか?

クラスにジェネリックメソッドがあります。

export class BaseService {
    public getAll<T>(): Observable<T> {
        // get type of T

        // const type = typeof(T); // Tried this but getting compilation exceptions 

        return this.http.get<T>(this.actionUrl + 'getAll');
    }
}

他のいくつかのTypeScriptクラスから、以下のようなメソッドを呼び出します。

this.service.getAll<SubscriberData>().subscribe(response => {
      // Response
    }, error => {
      console.log(error);
    }, () => {
      // do something commonly
    });

私がこれを試したとき、次の例外が発生しました

const type = typeof(T); 

「T」はタイプのみを参照しますが、ここでは値として使用されています。

編集:

ジェネリックメソッドを呼び出しているクラスのタイプを取得しようとしています。例:getAll<SubscriberData>そのメソッド内でSubscriberData型を取得したいと思います。

これどうやってするの?

9
RajeshKdev

クラスデコレータのクラスのコンストラクタ参照、プロパティ(またはアクセサ)デコレータのプロパティ、またはパラメータデコレータのパラメータにアクセスできます( reflect-metadata を使用)。

残念ながら、ジェネリック型の引数はこのように実行時に使用できません。それらは常に、単純なObject型に相当する実行時の引数を生成します。

代わりに、ジェネリック型を推測するために使用できるコンストラクター参照を提供できます(つまり、ジェネリック型を指定する代わりに、そのジェネリック型の対応するコンストラクター参照を指定します)。

_export class BaseService {
    public getAll<T>(TCtor: new (...args: any[]) => T): Observable<T> {
        // get type of T
        const type = typeof(TCtor);

        // ...
    }
}
_

そして、次のように使用します。

_new BaseService().getAll(DataClass); // instead of 'getAll<DataClass>()'
_

遊び場のデモ

タイプnew (...args: any[]) => Tは単純に言うと、ジェネリックTタイプ(つまり、ジェネリックTインスタンスタイプ)。

8
John Weisz