在 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
}
我正在尝试创建一个装饰器,将 属性 添加到其目标 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
}