Typescript:使用装饰器向类添加接口信息

时间:2018-04-09 16:06:36

标签: typescript decorator

说我有这样的装饰者:

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;
}

装饰器可以自动添加接口的实现吗?

1 个答案:

答案 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}}