我在类中有一个泛型方法。
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');
}
}
我将从其他一些打字稿类中调用下面的方法。
this.service.getAll<SubscriberData>().subscribe(response => {
// Response
}, error => {
console.log(error);
}, () => {
// do something commonly
});
当我尝试这样做时会出现以下异常
const type = typeof(T);
'T'仅指类型,但在此处用作值。
修改
我正在尝试获取调用泛型方法的类的类型。对于Ex:getAll<SubscriberData>
我希望在该方法中获得类型SubscriberData
。
我该怎么做?
答案 0 :(得分:6)
您可以访问类装饰器中类的构造函数引用,属性(或访问器)装饰器中的属性或参数装饰器中的参数(使用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
类型的新类型(即类/构造函数)(换句话说,通用{{1}的相应类/构造函数)实例类型)。