如何基于泛型为TypeScript类添加属性?
为动态扩展类添加TypeScript类型的解决方案
我正在尝试给一个已投入使用的JavaScript类添加TypeScript类型。这个类接收一个类对象集合,会创建这些类的实例并挂载到自身上,对应的TypeScript代码如下:
class FancyClass<N extends Record<string, BaseClass>> { // TODO: Add more keys [P in keyof N]: InstanceType<N[P]>; constructor(classes: N) { for (const [name, NestClass] of Object.entries(classes)) { this[name] = new NestClass(); } } }
这种通过传入类对象而非单独定义的方式扩展类,对其他函数来说很实用,示例如下:
class RealClass extends FancyClass { constructor() { super({ classA: ClassA, }); } otherMethods() { } } const fancy = new RealClass(); fancy.otherMethods(); fancy.classA.method();
我已经用函数式的方式实现了需求,但这会大幅改动现有代码,代码如下:
function withFancy<N extends Record<string, BaseClass>>( baseClass: BaseClass & InstanceTypes<N>, props: N ): BaseClass & InstanceTypes<N> { }
我也尝试过使用mixin,但看起来不是合适的解决方案。请问如何将这些泛型属性添加到类中?
@Dimava提供的适配解决方案
function withProps<N extends FancyOptions>(props: N) { return class MiddleClass extends FancyClass<N> { constructor(...args) { super(props, ...args); } } as new (name: string, options: any) => BaseClass & InstanceTypes<N>; } export class RealClass extends withProps({ c: NestedClass }) { }
内容的提问来源于stack exchange,提问作者Smuj Em
相关产品推荐
相关产品推荐

