如何在Typescript中获取泛型方法中的T类型?

时间:2018-05-27 08:33:07

标签: angular typescript generics

我在类中有一个泛型方法。

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

我该怎么做?

1 个答案:

答案 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>()'

Demo on playground

类型new (...args: any[]) => T简单地说:一个返回通用T类型的新类型(即类/构造函数)(换句话说,通用{{1}的相应类/构造函数)实例类型)。