export type Disposer = () => void; interface Extendable { push(...vals: T[]): void; } export type ExtendableDisposer = Disposer & Extendable; export function disposer(...args: Disposer[]): ExtendableDisposer { const res = () => { args.forEach(dispose => dispose?.()); args.length = 0; }; res.push = (...vals: Disposer[]) => { args.push(...vals); }; return res; }