在 TypeScript 中使用装饰器添加 class 属性

Add a class property using a decorator in TypeScript

我正在尝试创建一个装饰器,将 属性 添加到其目标 class。

这是我的装饰器实现:

export type Constructable<T> = new (...args: any[]) => T;

export function ValidationSchema() {
  return <BaseClass extends Constructable<{}>>(target: BaseClass) =>
    class extends target {
      constructor(...args: any[]) {
        super(...args);
      }

      validate() {
        console.log(this);
      }
    };
}

这就是我应用装饰器的方式:

@ValidationSchema()
export class Test {
  public foo: string;
}

这工作正常,但是当我尝试在 class 实例上调用 validate 方法时,我收到错误消息,指出 属性 在该类型上不存在。使用 // @ts-ignore 我可以解决这个问题并且它按预期工作。

有没有办法让 TypeScript 识别 Test 的 class 实例(或任何其他用装饰器装饰的 class 实例)实际上是我在装饰器中返回的匿名类型 class?

我已经看过 a GitHub issue which was revolving around a similar problem and Mixin calsses,但我不知道如何在我的装饰器方法中实现它。这甚至可以使用装饰器,还是我最好使用工厂函数?

非常感谢您提出任何建议!

遗憾的是,我认为这是不可能的,在我看来,装饰器非常适合添加“隐藏”的东西,但如果您需要显式访问您正在添加的 properties/methods,我会使用其他一些策略,例如:

function addThing<T>(obj: T): T & { thing: () => ... } {
  // code
}