export const debounceAsync = ( fn: (...args: TArgs) => Promise, ms: number ): ((...args: TArgs) => Promise) => { let timeout: NodeJS.Timeout | null = null return async function (this: unknown, ...args: TArgs): Promise { if (timeout) { clearTimeout(timeout) } return new Promise((resolve, reject) => { timeout = setTimeout(() => { fn.apply(this, args).then(resolve, reject) }, ms) }) } }