Estoy tratando de hacer un decorador que pueda:
Esto es lo que probé:
class Foo { static cachedMethods: Map<string, (arg: string) => void> = new Map(); static decorator = (decoratorArg: string) => ( target: Object, propertyKey: string, descriptor: TypedPropertyDescriptor<any> ): any => Foo.cachedMethods.set(decoratorArg, target as (arg: string) => void); } class Bar { @Foo.decorator("some data") method1(arg: string) { console.log(arg); } @Foo.decorator("some other data") method2(arg: string) { console.log(arg); } } let func: Function = Foo.cachedMethods.get("some data")!; func("hello world");Sin embargo, dice que func no es una función. Lo está almacenando como la clase Bar. ¿Cómo puedo almacenar el método como una función?
El primer argumento de target que recibe la función decoradora es en realidad el prototipo de clase. Así que en tu caso será prototipo de Bar .
https://www.typescriptlang.org/docs/handbook/decorators.html#method-decorators
La expresión para el decorador de métodos se llamará como una función en tiempo de ejecución, con los siguientes tres argumentos:
- La función constructora de la clase para un miembro estático o el prototipo de la clase para un miembro de instancia.
- El nombre del miembro.
- El descriptor de propiedad del miembro.
Como desea almacenar una referencia al método , puede usar target[propertyKey] o descriptor.value