我有以下代码
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机制吗?
答案 0 :(得分:2)
装饰器不是为了改变类原型而设计的。
有request in the official TypeScript repository通过装饰器来支持类的变异。
目前,您可以使用装饰器使用reflect-metadata添加元数据。然后,您可以在运行时验证该类是否具有该元数据,并在需要但是丢失时抛出异常。