我有一个通用函数,我想获取传入的类的名称。
public addComponent<T extends Component>(): Component {
comp = new Component() as T;
comp.name = T.constructor.name;
console.log(comp.name);
return comp;
}
然后假设我这样调用它:
obj.addComponent<MyClass>();
然后我希望日志显示“MyClass”。但目前我收到一条错误消息:
Cannot find name 'T'.
最佳答案
没有办法做到这一点。
T
在运行时不存在,它仅用于编译,编译器将其(连同类型)删除,因此生成的 javascript:
class MyFactory {
public addComponent<T extends Component>(): Component {
let comp = new Component() as T;
comp.name = T.constructor.name;
console.log(comp.name);
return comp;
}
}
是:
var MyFactory = (function () {
function MyClass() {
}
MyFactory.prototype.addComponent = function () {
var comp = new Component();
comp.name = T.constructor.name;
console.log(comp.name);
return comp;
};
return MyFactory;
}());
如你所见,js代码没有泛型签名,所以没有T
的定义,所以T.constructor
会导致你的错误'接收。
如果您希望该方法通过传递它来创建类的实例,那么它应该如下所示:
interface ComponentConstructor<T extends Component> {
new(): T;
name: string;
}
class Component {
name: string;
}
class MyComponent extends Component {}
class MyFactory {
public addComponent<T extends Component>(ctor: ComponentConstructor<T>): Component {
let comp = new ctor();
comp.name = ctor.name;
console.log(comp.name);
return comp;
}
}
let factory = new MyFactory();
let obj = factory.addComponent(MyComponent as ComponentConstructor<MyComponent>);
关于javascript - 泛型获取类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38861177/