クラスにジェネリックメソッドがあります。
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
型を取得したいと思います。
これどうやってするの?
クラスデコレータのクラスのコンストラクタ参照、プロパティ(またはアクセサ)デコレータのプロパティ、またはパラメータデコレータのパラメータにアクセスできます( 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
インスタンスタイプ)。