2017-09-18 4 views
0

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?

Antwort

1

Sie eine Methode Dekorateur verwenden sollte, keine Eigenschaft Dekorateur:

declare type MethodDecorator = <T>(target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>) => TypedPropertyDescriptor<T> | void; 

Dekorateur, die jedes Verfahren hinzugefügt werden kann, ein Versprechen der Rückkehr wäre:

function TypeRestrictedMethodDecorator(
    target: Object, // The prototype of the class 
    propertyKey: string, // The name of the method 
    descriptor: TypedPropertyDescriptor<(... p:any[]) => Promise<any>> 
    ) { 
    console.log("TypeRestrictedMethodDecorator called on: ", target, propertyKey, descriptor); 
} 

class TypeRestrictedMethodDecoratorExample { 
    @TypeRestrictedMethodDecorator 
    method(num: number): Promise<number> { 
     return new Promise((res, rej)=> res(10)); 
    } 

    @TypeRestrictedMethodDecorator // Error 
    method2(num: number): number { 
     return 10; 
    } 
} 

Probe von here modifiziert

+0

Was war genau das Problem? Verwenden von PropertyDescriptor anstelle von TypePropertyDescriptor? – lilezek

+0

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 –

Verwandte Themen