枚举在Typescript中实现接口的所有类

枚举在Typescript中实现接口的所有类,typescript,Typescript,大家好,打字员们 我想做的是:我想创建一个接口——比如说IShape——并有一组实现IShape的类矩形、圆形、三角形 假设IShape有一个名为GetName的方法,该方法返回一个由形状名称组成的字符串。为了便于讨论,我们假设实现GetName的每个类都返回一个硬编码字符串,例如:矩形、圆形、尖形。让我们假设IShape也实现了Draw方法 在运行时,我希望能够列出并初始化实现IShape的所有类,以便显示用户可以选择的形状的下拉列表。当用户选择形状类型时,系统将调用该形状的绘制方法 但关键是

大家好,打字员们

我想做的是:我想创建一个接口——比如说IShape——并有一组实现IShape的类矩形、圆形、三角形

假设IShape有一个名为GetName的方法,该方法返回一个由形状名称组成的字符串。为了便于讨论,我们假设实现GetName的每个类都返回一个硬编码字符串,例如:矩形、圆形、尖形。让我们假设IShape也实现了Draw方法

在运行时,我希望能够列出并初始化实现IShape的所有类,以便显示用户可以选择的形状的下拉列表。当用户选择形状类型时,系统将调用该形状的绘制方法

但关键是:稍后,我希望能够创建一个实现IShape的新类,比如方形和椭圆形。在运行代码的下一种类型中,我希望新类出现在下拉列表中,而不必对代码的其余部分进行太多更改

如何在Typescript中实现这一点

我的目标是创建一些东西,允许其他团队成员通过添加实现我的界面的新形状来扩展我的代码,而不必有一个要接受的硬编码形状列表


提前感谢您的帮助。

我将在我自己的代码中解释我将如何做这件事,并声明这有点自以为是,您可能不喜欢

首先,我使用标准ES6导入和导出。我希望我的所有形状都位于代码库中的同一文件夹中,与index.ts文件一起,该文件提供从整个目录导出的内容。因此,我的结构可能看起来像:

|-- src/
|    |-- shapes/
|    |    |-- index.ts
|    |    |-- IShape.ts
|    |    |-- Rectangle.ts
|    |    |-- Circle.ts
|    |    |-- Triangle.ts
|    |
|    |-- ShapeList.ts
export interface IShape {
  draw(): void;
}
IShape.ts看起来像:

|-- src/
|    |-- shapes/
|    |    |-- index.ts
|    |    |-- IShape.ts
|    |    |-- Rectangle.ts
|    |    |-- Circle.ts
|    |    |-- Triangle.ts
|    |
|    |-- ShapeList.ts
export interface IShape {
  draw(): void;
}
在Rectangle.ts、Circle.ts、Triangle.ts中,我有如下代码:

import { IShape } from './IShape';

export class Circle implements IShape {
  static getName: () => 'Circle';
  draw(): void {
    //...
  }
}
然后在index.ts中,我会:

最后在ShapeList.ts中,我只是利用导出的形状来获取我的ShapeList

从“./shapes”导入形状

export class ShapeList {
  getItems() {
    return shapes.map(shape => ({
      label: shape.getName(),
      action: () => new shape(), // Setting up a simple factory method for use when this item is selected in the list
    }));
  }

  // ... Rest of the class
}
就这样。有些人可能会说这仍然是硬编码,因为有一个明确的形状列表定义,但我会说,否则,我们不是硬编码一个特定的形状列表数组,而是我们有机地利用我们的形状结构

现在添加新形状与添加形状相同,否则将是:

编写形状类代码 确保它被正确导出