Skip to content

Instantly share code, notes, and snippets.

View cefn's full-sized avatar

Cefn Hoile cefn

View GitHub Profile
@cefn
cefn / reconcile_promise_lookup.ts
Created December 20, 2023 14:44
Create a synchronous structure from a lookup of promises
/** Stricter keyof */
export type RecordKey<T> = T extends Partial<infer R> ? (R extends Record<infer K, unknown> ? K : never) : never;
/** Stricter type for members of Object.entries(t) */
export type RecordEntry<T> = { [K in RecordKey<T>]: [K, Required<T>[K]] }[RecordKey<T>];
/** Type-narrowed equivalent of Object.entries */
export function entries<T extends Readonly<NonNullable<{}>>>(obj: T) {
return Object.entries(obj) as RecordEntry<T>[];
}
async function withMockedProperty<
Obj extends NonNullable<unknown>,
Name extends keyof Obj,
>(obj: Obj, name: Name, mock: Obj[Name], procedure: () => Promise<T>) {
const originalProperty = obj[name];
try {
obj[name] = mock;
await procedure();
} finally {
obj[name] = originalProperty;