Typescript - 获取接口(interface)的所有实现

标签 typescript

我正在寻找一种方法来获取在 Typescript 中实现特定接口(interface)的所有类的列表。

例如,在 .Net 中,您可以使用反射来执行此操作,但我找不到有关在 Typescript 中执行相同操作的任何信息。

我想做的代码示例:

interface IControlPanel { }
class BasicControlPanel implements IControlPanel { }
class AdvancedControlPanel implements IControlPanel { }
window.onload = () =>
{
    var controlPanels = IControlPanel.GetImplementations();
    for (var x = 0; x < controlPanels.length; x++)
    {
        document.write(controlPanels[x] + ", "); //outputs: BasicControlPanel, AdvancedControlPanel,
    }
};

当然,如果这些类易于实例化,那就更好了。

最佳答案

正如我在评论中提到的,它是一个声明的 non-goal TypeScript(参见非目标 #5)发出依赖于类型系统的 JavaScript,因此在运行时不会有任何东西可以自动使用来做你想做的事。

当然,您可以使用 TypeScript 来帮助您维护一个类型注册表,这些类型几乎可以完全按照您的需要使用。我建议使用 class decorators ,像这样:

interface IControlPanel {
  // add some methods or something to distinguish from {}
  doAThing(): void;
}

// add a registry of the type you expect
namespace IControlPanel {
  type Constructor<T> = {
    new(...args: any[]): T;
    readonly prototype: T;
  }
  const implementations: Constructor<IControlPanel>[] = [];
  export function GetImplementations(): Constructor<IControlPanel>[] {
    return implementations;
  }
  export function register<T extends Constructor<IControlPanel>>(ctor: T) {
    implementations.push(ctor);
    return ctor;
  }
}

现在,不用声明类实现 IControlPanel,而是使用 @IControlPanel.register:

@IControlPanel.register
class BasicControlPanel {
  doAThing() { }
}

@IControlPanel.register
class AdvancedControlPanel {
  doAThing() { }
}

如果你尝试注册一个没有实现IControlPanel的类,你会得到一个错误:

// error, doAThing is missing from BadControlPanel
@IControlPanel.register
class BadControlPanel {
  doNothing() { }
}

现在您可以按照自己喜欢的方式使用注册表,主要是:

window.onload = () => {
  var controlPanels = IControlPanel.GetImplementations();
  for (var x = 0; x < controlPanels.length; x++) {
    document.write(controlPanels[x].name + ", ");
    const panel = new controlPanels[x]();
    panel.doAThing();
  }
};

我说“大部分”是因为我存储了构造函数,而不是字符串,因为您想要一种实例化它们的方法。您可以获得字符串构造函数的 name 属性。您可以实例化这些类,假设它们都采用相同的构造函数参数类型。

希望对您有所帮助;祝你好运!

Stackblitz example

关于Typescript - 获取接口(interface)的所有实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47082026/

相关文章:

javascript - 编写 TypeScript 并为浏览器和 Node 生成一个库

node.js - Redis 中的 typescript 错误 - 事件

javascript - 与 TypeScript react : What type is render()?

angular - 对象类型上不存在属性长度

javascript - TypeScript:获取位于任意路径上的cookie

带有@types/swiper 的 Angular

angular - 使用 Chartjs Angular 按值排序和隐藏图例项

angular - 如何在 Visual Studio Code(热键)中格式化文件?

Angular 4 无法绑定(bind)到 <property> 因为它不是 <component> 的已知属性

javascript - Typescript - "this"关键字错误