我正在使用 webpack、typescript 2.8、es5。
我想从变量名创建动态类实例,例如:
protected handleAfterInit(page) : void
{
let instance: any;
let pageName: string = this.capitalizeFirstLetter(page);
console.log(pageName);
instance = Object.create((window[pageName]).prototype);
instance.constructor.apply(instance);
console.log(instance);
}
其中 pageName 是一个变量(Home、About 等)并且这些类已经导入到页面顶部:
import { Home } from "./Home";
import { About } from "./About";
但是使用当前代码我得到一个错误:
Cannot read property 'prototype' of undefined
好像没有窗口。{class}
是否可以在 typescript 中做这样的事情?
最佳答案
由于您从模块中导入类 Home
和 About
,因此它们不在 window
对象中。
最简单的方法是使用构造函数签名:
protected handleAfterInit(page: new () => any): void {
let instance = new page()
}
如果您需要按名称访问页面,您可以创建一个包含页面的 map ,然后调用 avbove 方法:
pagesByName : { [name: string] :new () => any } = {Home, About};
protected handleAfterInitByName(pageName: string): void {
this.handleAfterInit(this.pagesByName [pageName]);
}
您还可以将 new () => any
中的 any
替换为所有页面的基类,以提供更好的类型检查。
关于typescript - 在 typescript 中创建动态类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49452798/