如何获得打字稿的Generic class <T>名称?

Sha*_*tul 13 typescript

我的通用课程

 export class BaseService<T> {
 public subUrl;
 constructor(public repo:RepogitoryService) { }
}
Run Code Online (Sandbox Code Playgroud)

如何将T的类名存储在局部变量上?

dur*_*k10 15

你必须明白,Typescript只是一个转换器(编译器到javascript).一些语法糖(例如泛型)仅在类型检查阶段起作用(并且它对IDE /文本编辑器中的intellisense有帮助).

但是,对变量的赋值是在运行时进行的,在运行时它只是一个简单的Javascript.运行时没有类型也没有泛型.

但这是我最简单的方法:

class Some<T> {
    private TName : string;
    constructor(x : T&Function) {
        this.TName = x.name;
    }
}

class Another {

}

const some = new Some<Another>(Another);
Run Code Online (Sandbox Code Playgroud)

  • @hakan OP询问如何将泛型类型名称存储为局部变量,这正是此代码的作用。该变量的可见性与原始问题无关。 (7认同)
  • 如果“Another”中有一些字段,这似乎不起作用。 (2认同)

Jul*_*lph 7

不幸的是,你不能.Typescript是一个静态类型检查器,在runetime不支持类型反射,例如java.这是因为它的来源被转换为javascript.

但是,未来有这种支持的希望,有一个名为"自定义变换器"的新打字稿功能.那些变换器是插入蒸发过程的插件,打开了关于类型反射的丰富功能的道路.这样的第一个例子是ts-transformer-keys.

  • 它不需要运行时类型检查。它有一个编译阶段,可以插入类型的字符串值...... (2认同)

Yar*_*rii 7

durisvk10解决办法涵盖的话题,只是想补充一点,我宁愿用
x: new () => Tx: T&Function.

像这样:

...
constructor(x : new () => T) {
    this.TName = x.name;
}    
...
Run Code Online (Sandbox Code Playgroud)

  • 您不能在方法主体中使用泛型,正如 durisvk10 所解释的那样,它仅在类型检查阶段起作用。但是,您可以将类型作为参数传递给您的方法(在这种特殊情况下是构造函数)。并且通过使用这种类型符号,你告诉类型检查器你期望这里是 type (new () =&gt; T) ,它描述了一个带有空构造函数的类型。您可以在 [此处](https://blog.rsuter.com/how-to-instantiate-a-generic-type-in​​-typescript/) 和 [此处](https://www.typescriptlang. org/docs/handbook/generics.html) (5认同)
  • 请解释一下这一点 (3认同)

lol*_*elo 5

将对象转换为Object并获取构造函数名称?

function nameOf(object: Object): string {
    return object.constructor.name;
}
Run Code Online (Sandbox Code Playgroud)