javascript - TypeScript:如何创建一个具有基类所有方法而无需手动声明的包装类?

标签 javascript typescript

例如,我有一个基类:

class Base {
    void A();
    void B();
}

我正在尝试创建一个子类:

class Sub extends Base {
    bool canA() { ... }

    void A() { return this.canA() ? Base.A() : undefined; }
    void B() { return Base.B(); }
}

我的目标是让子类覆盖 Base 中的所有方法类,以便重写的方法将首先调用 canX()如果该方法在 Sub 中定义类,然后调用 Base.X()如果最后一次调用返回 true。

我当然可以手动定义那些包装方法;然而,以某种方式自动/编程地完成它会很好。我对 TypeScript 很陌生,所以如果我的问题没有任何意义,我很抱歉。有什么建议吗?

最佳答案

这是可能的,但很痛苦。您循环访问 Base.prototype 的方法并创建包装器:

class Base {
    a(): void {
        // ...
    }
    b(): void {
        // ...
    }
}
class Sub extends Base {
    canA(): boolean {
        // ...
    }
    canB(): boolean {
        // ...
    }
}
const baseProto = Base.prototype as Record<string,any>;
const subProto = Sub.prototype as Record<string,any>;
for (const name of Object.getOwnPropertyNames(Base.prototype)) {
    const method = baseProto[name];
    if (typeof method === "function") {
        subProto[name] = function(...args: any[]) {
            if (this["can" + name.toUpperCase()]()) {
                method.call(this, ...args);
            }
        };
    }
}

Playground Link上面的代码加上演示它工作的代码。

请注意,此代码假设:

  1. 这些方法具有小写名称(JavaScript 和 TypeScript 中的标准),例如ab
  2. “can”方法是带有“can”前缀的小写名称,例如canAcanB
  3. 这些方法都有 void 返回类型(否则,您的包装器会略有不同)

关于javascript - TypeScript:如何创建一个具有基类所有方法而无需手动声明的包装类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57738464/

相关文章:

javascript - trigger.io 卡在 iOS 的启动画面上

typescript - 避免将请求对象包装到 OpenAPI Generator 中的 InlineObject1 中,从 OpenAPI 3.0 规范到 Typescript

testing - 在生产模式下隐藏 angular2 组件的最佳解决方案?

javascript - 用 typescript 编写的 CLick 事件监听器自行解除绑定(bind)

javascript - 如何在数组的索引处插入重复项?

typescript - 如何使用 typed-rest-client 设置请求 header ?

javascript - 在 AngularJs 中迭代对象时,如何在 ng-repeat 中使用过滤器

javascript - MVC4 ajax调用并正确返回数据

javascript 如果函数是对象那么为什么这行不通

javascript - 自动提示最合适的数据结构是什么?