说我有这样的装饰者:
export function Entity(options?: string) {
return (target) => {
//do something with class(target) here
}
}
和一个可以这样装饰的课程:
@Entity({someOptions: "foobar"})
export class Product {
id: string;
title: string;
price: number;
}
如何在不执行此操作的情况下自动强制ID:
interface EntityInterface {
id: string;
}
@Entity({someOptions: "foobar"})
export class Product implements EntityInterface {
id: string;
title: string;
price: number;
}
装饰器可以自动添加接口的实现吗?
答案 0 :(得分:0)
装饰者不能改变类的结构,这是设计的。你可以做的是使用一个函数,该函数将类作为参数并返回一个具有额外字段的新类:
export function Entity(options?: string) {
return <T extends new (...args: any[]) => any>(target: T) => {
return class extends target {
id: string
constructor(...args: any[]) {
super(...args);
this.id = options;
}
}
}
}
export const Product = Entity("foobar")(class Product {
public constructor(values: Partial<Product>) {
}
title: string;
price: number;
});
let d = new Product({
title: ""
});
您可以在函数内部派生的类中添加字段和方法,并且它将在返回的类中可用,唯一可能的问题是在作为参数传递给{的类中无法访问字段/方法{1}}