我可以通过装饰器在编译时向类添加属性吗?

时间:2017-05-11 20:49:43

标签: typescript aop

我有以下代码

export class TestClass {
    query<TId, TRequest extends TId, TResponse extends TId>(request: TRequest) : TResponse {
        return null;
    }

    test() {
        let request = new SomeQuery1();
        let response = this.query<{ "a b c" }, SomeQuery1, SomeResponse1>(request);
    }
}

class SomeQuery1 {
    public "a b c": string;
}
class SomeResponse1 {
    public "a b c": string;
}

“a b c”位只是我正在玩的标记,它让通用约束知道这两个类在某种程度上是相关的。我打算使用一个独特的名字。但无论如何,我想做的是这个

@myDecorator("a b c")
class SomeQuery1 {
}
@myDecorator("a b c")
class SomeResponse1 {
}

//Is effectively the same as this
class SomeQuery1 {
    public "a b c": string;
}
class SomeResponse1 {
    public "a b c": string;
}

这样原始的TestClass仍将在编译时使用相同的强类型检查。这可能是装饰器或任何其他TypeScript机制吗?

1 个答案:

答案 0 :(得分:2)

装饰器不是为了改变类原型而设计的。

request in the official TypeScript repository通过装饰器来支持类的变异。

目前,您可以使用装饰器使用reflect-metadata添加元数据。然后,您可以在运行时验证该类是否具有该元数据,并在需要但是丢失时抛出异常。