Skip to content

Commit 23f62dd

Browse files
committed
Make deferreds themselves into promises, not just wrappers
1 parent 6600773 commit 23f62dd

File tree

1 file changed

+11
-8
lines changed

1 file changed

+11
-8
lines changed

src/promises.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,24 +25,27 @@ export async function doWhile<T>(
2525
} while (await whileFn());
2626
}
2727

28-
export interface Deferred<T> {
28+
/**
29+
* A deferred is a promise (you can await it directly) but also exposes the promise
30+
* explicitly at .promise, and exposes public resolve & reject callbacks for external
31+
* resolution.
32+
*/
33+
export interface Deferred<T> extends Promise<T> {
2934
resolve: (arg: T) => void,
30-
reject: (e?: Error) => void,
35+
reject: (e: Error) => void,
3136
promise: Promise<T>
3237
}
3338

3439
export function getDeferred<T = void>(): Deferred<T> {
35-
let resolve: undefined | ((arg: T) => void) = undefined;
36-
let reject: undefined | ((e?: Error) => void) = undefined;
40+
let resolve!: ((arg: T) => void);
41+
let reject!: ((e: Error) => void);
3742

38-
let promise = new Promise<T>((resolveCb, rejectCb) => {
43+
const promise = new Promise<T>((resolveCb, rejectCb) => {
3944
resolve = resolveCb;
4045
reject = rejectCb;
4146
});
4247

43-
// TS thinks we're using these before they're assigned, which is why
44-
// we need the undefined types, and the any here.
45-
return { resolve, reject, promise } as any;
48+
return Object.assign(promise, { resolve, reject, promise });
4649
}
4750

4851
/**

0 commit comments

Comments
 (0)