这是decorator example in the typescript website:
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
@enumerable(false)
greet() {
return "Hello, " + this.greeting;
}
}
function enumerable(value: boolean) {
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
descriptor.enumerable = value;
};
}
如您所见,装饰器工厂返回一个函数,该函数接受目标键和属性键以获取方法属性。
现在,我想创建一个接受方法的装饰器并进行类型检查,以确保传递的方法和方法属性具有相同的类型:
const auxMethod = (str: string) => 'a';
class Greeter {
@myMethod(auxMethod)
greet(str: string) {
return "Hello, " + str;
}
}
您可以看到auxMethod和greet具有相同的类型。可以在打字稿中键入检查吗?
如果装饰器通过内部装饰器工厂中的实际方法,那么使用泛型将很简单:
function myMethod<T> (handler: T) {
return function (target: T) {
};
}
但是由于target和propertyKey是动态的,所以不能。