Promise.withResolvers (ES2024, TS 5.4+) liefert das Promise zusammen mit seinen resolve- und reject-Funktionen, ohne dass du sie im Executor-Callback einfangen musst. Das umgeht das hässliche 'let resolve!; new Promise(r => { resolve = r; })'-Deferred-Pattern und erlaubt Cancellation-Tokens, Semaphoren oder ereignisgesteuerte Gates, die von außerhalb des Konstruktor-Scopes aufgelöst werden. Der typisierte Generic-Parameter erhält die Form des aufgelösten Werts, und ein Wrapper wie createGate fügt Idempotenz hinzu — entscheidend, wenn mehrere Aufrufer um dieselbe Future konkurrieren.
function createGate<T>() {const { promise, resolve, reject } = Promise.withResolvers<T>();let settled = false;return {promise,open(value: T) {if (settled) return;settled = true;resolve(value);},fail(err: unknown) {if (settled) return;settled = true;reject(err);},};}const gate = createGate<number>();setTimeout(() => gate.open(42), 100);const value = await gate.promise; // 42