[英]Generics get class name
我有一個通用函數,我想獲取傳入的類的名稱。
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”。 但是目前我收到一條錯誤消息:
找不到名稱“ T”。
無法做到這一點。
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>);
( 操場上的代碼 )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.