You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于泛型为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 09:27:19