枚举在Typescript中实现接口的所有类
大家好,打字员们 我想做的是:我想创建一个接口——比如说IShape——并有一组实现IShape的类矩形、圆形、三角形 假设IShape有一个名为GetName的方法,该方法返回一个由形状名称组成的字符串。为了便于讨论,我们假设实现GetName的每个类都返回一个硬编码字符串,例如:矩形、圆形、尖形。让我们假设IShape也实现了Draw方法 在运行时,我希望能够列出并初始化实现IShape的所有类,以便显示用户可以选择的形状的下拉列表。当用户选择形状类型时,系统将调用该形状的绘制方法 但关键是:稍后,我希望能够创建一个实现IShape的新类,比如方形和椭圆形。在运行代码的下一种类型中,我希望新类出现在下拉列表中,而不必对代码的其余部分进行太多更改 如何在Typescript中实现这一点 我的目标是创建一些东西,允许其他团队成员通过添加实现我的界面的新形状来扩展我的代码,而不必有一个要接受的硬编码形状列表枚举在Typescript中实现接口的所有类,typescript,Typescript,大家好,打字员们 我想做的是:我想创建一个接口——比如说IShape——并有一组实现IShape的类矩形、圆形、三角形 假设IShape有一个名为GetName的方法,该方法返回一个由形状名称组成的字符串。为了便于讨论,我们假设实现GetName的每个类都返回一个硬编码字符串,例如:矩形、圆形、尖形。让我们假设IShape也实现了Draw方法 在运行时,我希望能够列出并初始化实现IShape的所有类,以便显示用户可以选择的形状的下拉列表。当用户选择形状类型时,系统将调用该形状的绘制方法 但关键是
提前感谢您的帮助。我将在我自己的代码中解释我将如何做这件事,并声明这有点自以为是,您可能不喜欢 首先,我使用标准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
}
就这样。有些人可能会说这仍然是硬编码,因为有一个明确的形状列表定义,但我会说,否则,我们不是硬编码一个特定的形状列表数组,而是我们有机地利用我们的形状结构
现在添加新形状与添加形状相同,否则将是:
编写形状类代码
确保它被正确导出