En este momento estoy usando esta función para actualizar algunos tiempos de espera sin tener que pasar las devoluciones de llamada.
private _changeTimeout(timeout: NodeJS.Timeout, at: milliseconds): NodeJS.Timeout { // @ts-expect-error const timeout = setTimeout(timeout._onTimeout, at); clearTimeout(timeout); return timeout; }
¿Hay una mejor manera, sin tener que usar una variable privada que me obligue a usar // @ts-expect-error
?
Sí: cree su propio contenedor para setTimeout
para que no tenga que usar propiedades internas no documentadas de la clase Timeout
. El uso de propiedades internas no documentadas siempre será un peligro de mantenimiento.
Algo vagamente como:
class MyTimeout { private timeout: NodeJS.Timeout | null = null; constructor( private callback: (...args: any[]) => void, public ms: number, paused?: boolean, ) { if (!paused) { this.set(); } } set(ms?: number) { if (typeof ms !== "undefined") { this.ms = ms; } this.timeout = setTimeout((...args) => { this.callback(...args); this.timeout = null; }, this.ms); } clear() { if (this.timeout) { clearTimeout(this.timeout); this.timeout = null; } } change(ms: number) { const running = this.isRunning(); this.clear(); this.ms = ms; if (running) { this.set(ms); } } get isRunning() { return this.timeout !== null; } }
Uso:
const t = new MyTimeout(() => { // ... }, 1000); // ... t.change(2000);
Eso podría ser un poco exagerado, pero entiendes la idea.