【问题标题】:How to get the type of T inside generic method in Typescript?如何在 Typescript 的泛型方法中获取 T 的类型?
【发布时间】:2018-11-06 02:29:16
【问题描述】:

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

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' 仅指一种类型,但在这里用作值。

编辑:

我正在尝试获取调用泛型方法的类的类型。例如:getAll&lt;SubscriberData&gt; 我想在该方法中获取类型 SubscriberData

我该怎么做?

【问题讨论】:

  • 类型系统在编译时丢失,所以运行时不可用stackoverflow.com/questions/24469856/…
  • 我正在尝试获取调用泛型方法的类的类型。 For Ex: getAll&lt;SubscriberData&gt; 我想在该方法中获取 SubscriberData 类型。
  • 为了什么目的?
  • 将更多参数推送到 http 调用并通过基于类型检查此条件来更改 http url。

标签: angular typescript generics


【解决方案1】:

您可以访问类装饰器中的类的构造函数引用、属性(或访问器)装饰器中的属性或参数装饰器中的参数(使用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[]) =&gt; T 类型简单地说:返回泛型T 类型(换句话说,泛型T 实例类型的对应类/构造函数)的新类型(即类/构造函数)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2013-07-23
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多