动态类方法的打字稿类型

时间:2019-12-09 20:52:50

标签: javascript typescript class types interface

我正在尝试构建一个在构造函数阶段构建一些动态方法的类,一切正常,但是VS Code自动建议不适用于动态方法?我们应该怎么做? 这是codeSandBox

我也尝试过interface,但还是没有运气

export default class A {
  private version = 1;
  get getVersion() {
    return this.version;
  }
  private actions = ["approve", "edit", "delete"];
  constructor() {
    this.actions.forEach(
      method =>
        (A.prototype[method] = route => {
          console.warn(method + " called");
        })
    );
  }
}

const B = new A();
console.warn(B.getVersion);
console.warn(B.approve()) // auto suggestion not available here  

1 个答案:

答案 0 :(得分:0)

您可以执行此操作……但这确实很hacky。这样的元编程不可能完全进行类型检查。这是此解决方案的playground

首先,告诉TS动作是一个常量数组,以便可以缩小类型。

private actions = ["approve", "edit", "delete"] as const;

下一步,创建一个映射类型,该类型描述您的forEach方法添加到该类型的内容。

type _A = {
    [K in A['actions'][number]]: (route: string) => void
}

请注意,它必须是type。不能是interface

最后,添加一个扩展此类型别名的接口。我希望TS在这里对圆形性大喊大叫,但是显然这是可以的。

export default interface A extends _A {
}