Ich habe einen Dekorator für Methoden, die es nur mit Async-Methoden verwendet werden soll. Dies ist ein Beispiel der Nutzung:Beschränken Sie die Verwendung von Methoden-Dekoratoren
class A {
@deco() // This should work.
public async works() { }
@deco() // This should fail.
public fails() { }
}
Ich versuchte, den Dekorateur wie folgt zu definieren:
export function deco() {
return <T extends {[K in keyof T]:() => Promise<any>},
K extends string>
(target: T,
propertyKey: K,
descriptor: PropertyDescriptor) => {
// Decorator code here.
};
}
Aber es funktioniert nicht. Es scheitert in beiden works
und fails
Methoden, weil die K
[K in keyof T]
und die K
in K extends string
und propertyKey: K
nicht gleich sind, damit die K
nicht eingeschränkt ist ein Schlüssel von T. seine
Dies funktioniert auch nicht:
export function deco() {
return <T extends {[K in keyof T]:() => Promise<any>},
K extends keyof T>
(target: T,
propertyKey: K,
descriptor: PropertyDescriptor) => {
// Decorator code here.
};
}
Weder diese:
export function deco() {
return <T,
K extends keyof T>
(target: T & {[propertyKey]:() => Promise<any>},
propertyKey: K,
descriptor: PropertyDescriptor) => {
// Decorator code here.
};
}
Jede Idee?
Was war genau das Problem? Verwenden von PropertyDescriptor anstelle von TypePropertyDescriptor? – lilezek
Der 'PropertyDecorator' bietet keine Möglichkeit, basierend auf dem Typ des Ziels zu beschränken,' MethodDecorator' ist eine generische Methode und der generische Typ ist der Typ des Ziels. Im Allgemeinen, da Sie eine Methode dekorieren, sollten Sie den 'MethodDecorator' verwenden, wie der Name schon sagt –