export type DeferPromise = { promise: Promise resolve: (result: R) => void reject: (reason: any) => void entangle: (outsidePromise: Promise) => Promise } export function deferPromise(): DeferPromise { let resolve!: (result: R) => void let reject!: (reason: any) => void const promise = new Promise((res, rej) => { resolve = res reject = rej }) function entangle(outside: Promise) { outside.then(resolve).catch(reject) return promise } return {promise, resolve, reject, entangle} }