UNPKG

@hemia/autobind

Version:

A lightweight utility for automatic method binding in classes

149 lines (107 loc) 2.83 kB
# @hemia/autobind **Decoradores de autobind para TypeScript.** Este paquete proporciona tres decoradores para enlazar automáticamente métodos de clases a su instancia, asegurando que el contexto de `this` siempre apunte correctamente. Ideal para evitar errores comunes cuando se pasan funciones como callbacks. ## Características * `@BoundMethod`: memoriza y enlaza el método a su instancia. * `@BoundClass`: enlaza automáticamente todos los métodos de la clase. * `@Autobind`: funciona como `@BoundMethod` o `@BoundClass` según su uso. --- ## Instalación ```bash npm install @hemia/autobind ``` Asegúrate de habilitar `experimentalDecorators` en tu `tsconfig.json`: ```json { "compilerOptions": { "experimentalDecorators": true, "target": "ES6", "module": "commonjs" } } ``` --- ## Uso básico ### Importación ```ts import { BoundMethod, BoundClass, Autobind } from '@hemia/autobind'; ``` ### @BoundMethod ```ts class MiClase { private contador: number = 0; @BoundMethod incrementar() { this.contador++; console.log(`Contador: ${this.contador}`); } } const instancia = new MiClase(); const fn = instancia.incrementar; fn(); // Contador: 1 fn(); // Contador: 2 ``` ### @BoundClass ```ts @BoundClass class MiClaseAuto { private contador: number = 0; incrementar() { this.contador++; console.log(`Contador: ${this.contador}`); } decrementar() { this.contador--; console.log(`Contador: ${this.contador}`); } } const instancia = new MiClaseAuto(); const inc = instancia.incrementar; const dec = instancia.decrementar; inc(); // Contador: 1 dec(); // Contador: 0 ``` ### @Autobind como decorador universal #### Decorando un método: ```ts class OtraClase { constructor(private nombre: string) {} @Autobind saludar() { console.log(`Hola, soy ${this.nombre}`); } } const instancia = new OtraClase('Decorador'); const fn = instancia.saludar; fn(); // Hola, soy Decorador ``` #### Decorando una clase: ```ts @Autobind class ClaseCompleta { private valor = 10; metodo1() { console.log('Metodo 1:', this.valor); } metodo2() { console.log('Metodo 2:', this.valor); } } const instancia = new ClaseCompleta(); instancia.metodo1(); instancia.metodo2(); ``` --- ## Funcionamiento interno * `@BoundMethod` crea un getter que memoriza el `this` enlazado al primer acceso. * `@BoundClass` aplica `@BoundMethod` a todos los métodos del prototipo. * `@Autobind` detecta si se usa sobre clase o método, y aplica el decorador correspondiente. --- ## Contribuciones 1. Haz un fork del repositorio. 2. Crea una rama con tu funcionalidad: `git checkout -b feature/nueva-funcionalidad`. 3. Aplica tus cambios con commits descriptivos. 4. Abre un pull request. --- ## Licencia MIT License — Hemia Technologies