@@ -25,24 +25,27 @@ export async function doWhile<T>(
25
25
} while ( await whileFn ( ) ) ;
26
26
}
27
27
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 > {
29
34
resolve : ( arg : T ) => void ,
30
- reject : ( e ? : Error ) => void ,
35
+ reject : ( e : Error ) => void ,
31
36
promise : Promise < T >
32
37
}
33
38
34
39
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 ) ;
37
42
38
- let promise = new Promise < T > ( ( resolveCb , rejectCb ) => {
43
+ const promise = new Promise < T > ( ( resolveCb , rejectCb ) => {
39
44
resolve = resolveCb ;
40
45
reject = rejectCb ;
41
46
} ) ;
42
47
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 } ) ;
46
49
}
47
50
48
51
/**
0 commit comments