typescript - 在 typescript 中创建动态类实例

标签 typescript ecmascript-5

我正在使用 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 中做这样的事情?

最佳答案

由于您从模块中导入类 HomeAbout,因此它们不在 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/

相关文章:

TypeScript Fetch response.Json<T> - 预期 0 个类型参数,但得到 1 个

angular - 在 canActivate Guard 中访问 ActivatedRoute 的组件

javascript - VS Code 在我的 Typescript 项目中找不到模块

reactjs - 如何为组件编写抽象类(具有可扩展状态和 Prop )?

javascript - 下划线的each和ES5 forEach的区别

javascript - JavaScript 中包含两个赋值运算符的复合表达式的求值过程

typescript - 你如何连接两个(管道标准输入和标准输出)Deno 子进程?

javascript - 根据 Google JavaScript 风格指南的 block 内函数声明

javascript - 将公式转换为 JavaScript