`Promise.all` ist fail-fast: ein Reject verwirft alle erfüllten Werte — falsch, sobald partieller Erfolg fachlich Sinn ergibt (Fan-out-Fetches, Batch-Writes, parallele Migrations). `Promise.allSettled` liefert pro Item eine diskriminierte Union, und das `'fulfilled' | 'rejected'`-Tag ist genau das, worauf TypeScript narrowt. Beachte `reason: unknown` — der Vertrag ist sauber: ein abgelehntes Promise kann mit allem reagieren, auch mit Nicht-Errors. Widerstehe `(reason as Error).message` und nutze stattdessen Type-Guards wie `reason instanceof Error`. Der Cast `as Settled<T>[]` ist die einzige akzeptable Stelle — der lib-Typ nutzt `any` für `reason`, eine Verschärfung auf `unknown` zieht die richtige Disziplin durch den Rest des Codes.
type Settled<T> =| { status: 'fulfilled'; value: T }| { status: 'rejected'; reason: unknown };async function partition<T>(ps: ReadonlyArray<Promise<T>>): Promise<{ ok: T[]; failed: unknown[] }> {const results = await Promise.allSettled(ps);const ok: T[] = [];const failed: unknown[] = [];for (const r of results as Settled<T>[]) {if (r.status === 'fulfilled') {ok.push(r.value); // r is { status: 'fulfilled'; value: T }} else {failed.push(r.reason); // r is { status: 'rejected'; reason: unknown }}}return { ok, failed };}const { ok, failed } = await partition<number>([Promise.resolve(1),Promise.reject(new Error('boom')),Promise.resolve(2),]);// ok : number[] = [1, 2]// failed: unknown[] = [Error('boom')]