javascript - 导出类的变体
问题描述
我正在尝试导出我想在其他地方导入的类的一些变体。我不知道是否可以在不实例化的情况下创建它们?以及我该如何做到这一点。
这就是我现在所拥有的
索引.ts
export { Character } from './Character';
字符.ts
import { CharacterOptions, WarlockOptions } from './CharacterOptions';
class Character implements CharacterInterface {
private health: number;
private name: string;
private characterOptions: CharacterOptions;
constructor(name, health) {
this.name = name;
this.health = health;
this.characterOptions = new WarlockOptions(); // where WarlockOptions extends CharacterOptions
}
}
我希望能够在index.ts文件中做类似的事情
import { Character } from './Character';
import { ArcherOptions, WarlockOptions } from './CharacterOptions';
export const ArcherClass = someWrapperOfCharacter(ArcherOptions);
export const WarlockClass = someWrapperOfCharacter(WarlockOptions);
就像动态创建(通过someWrapperOfCharacter()
)一个我可以公开的新的特定类。
我知道我可以直接创建扩展类,Character
但我尽量避免这种情况,因为:
- 不知道
CharacterOptions
以后有多少 - 我不希望每次我想添加一个新的变体时都被迫创建一个新的变体
CharacterOptions
- 我想允许通过传递扩展的自定义对象直接创建自定义类
CharacterOptions
解决方案
您可以将选项的构造函数传递给类,并有一个函数创建派生类型,将选项类设置为特定的实现:
interface CharacterInterface { }
class CharacterOptions { public level?: number }
class ArcherOptions extends CharacterOptions { public bow?: string; }
class WarlockOptions extends CharacterOptions { public magic?: string }
class Character<T extends CharacterOptions> implements CharacterInterface {
private health: number;
private name: string;
private characterOptions: T;
constructor(name: string, health: number, optionsCtor: new () => T) {
this.name = name;
this.health = health;
this.characterOptions = new optionsCtor(); // where WarlockOptions extends CharacterOptions
}
}
function someWrapperOfCharacter<T extends CharacterOptions>(optionsCtor: new () => T) {
return class extends Character<T> {
constructor(name: string, health: number) {
super(name, health, optionsCtor);
}
}
}
export const ArcherClass = someWrapperOfCharacter(ArcherOptions);
export type ArcherClass = InstanceType<typeof ArcherClass> // needed to allow type declarations let a: ArcherClass
export const WarlockClass = someWrapperOfCharacter(WarlockOptions);
export type WarlockClass = InstanceType<typeof WarlockClass>
推荐阅读
- latex - CircuiTikZ 和 FET 绘图
- javascript - Angular Resize Event:防止用户在父 Div 之外调整内部 Div 的大小
- javascript - D3js - 路径卡在浏览器窗口的左上角 - 我如何集中它们?
- python - 从外部网站的元数据中获取内容
- matlab - 如何在matlab的appdesigner中设置表格的大小?
- javascript - 无需刷新即可显示和更新数据
- python-3.x - kivy 小部件总是更新到父小部件的大小
- java - 仅使用国家代码对手机号码进行排序
- selenium - Selenium 中的导航错误:链接在点 (...) 处不可点击。其他元素会收到点击
- ios - Cloud Firestore:如何从所有随机生成的文档中获取特定值