Skip to content

Commit 9d55f13

Browse files
committed
Fixed the issue with contextually typed return type of an async function when unions are involved
1 parent d25cfb5 commit 9d55f13

File tree

3 files changed

+11
-66
lines changed

3 files changed

+11
-66
lines changed

src/compiler/checker.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -26043,12 +26043,10 @@ namespace ts {
2604326043
return undefined;
2604426044
}
2604526045
contextualReturnType = iterationTypes.returnType;
26046-
// falls through to unwrap Promise for AsyncGenerators
2604726046
}
2604826047

2604926048
if (functionFlags & FunctionFlags.Async) { // Async function or AsyncGenerator function
26050-
// Get the awaited type without the `Awaited<T>` alias
26051-
const contextualAwaitedType = mapType(contextualReturnType, getAwaitedTypeNoAlias);
26049+
const contextualAwaitedType = mapType(contextualReturnType, functionFlags & FunctionFlags.Generator ? getAwaitedTypeNoAlias : getAwaitedTypeOfPromise);
2605226050
return contextualAwaitedType && getUnionType([contextualAwaitedType, createPromiseLikeType(contextualAwaitedType)]);
2605326051
}
2605426052

tests/baselines/reference/contextuallyTypeAsyncFunctionReturnTypeFromUnion.errors.txt

-53
This file was deleted.

tests/baselines/reference/contextuallyTypeAsyncFunctionReturnTypeFromUnion.types

+10-10
Original file line numberDiff line numberDiff line change
@@ -20,26 +20,26 @@ createMachine<{ count: number }>({
2020
>createMachine<{ count: number }>({ services: { test: async () => Promise.reject("some err"), async test2() { return Promise.reject("some err"); }, },}) : void
2121
>createMachine : <T>(implementations: { services: Record<string, () => Promise<T> | StateMachine<T>>; }) => void
2222
>count : number
23-
>{ services: { test: async () => Promise.reject("some err"), async test2() { return Promise.reject("some err"); }, },} : { services: { test: () => Promise<{ count: number; } | StateMachine<{ count: number; }>>; test2(): Promise<{ count: number; } | StateMachine<{ count: number; }>>; }; }
23+
>{ services: { test: async () => Promise.reject("some err"), async test2() { return Promise.reject("some err"); }, },} : { services: { test: () => Promise<{ count: number; }>; test2(): Promise<{ count: number; }>; }; }
2424

2525
services: {
26-
>services : { test: () => Promise<{ count: number; } | StateMachine<{ count: number; }>>; test2(): Promise<{ count: number; } | StateMachine<{ count: number; }>>; }
27-
>{ test: async () => Promise.reject("some err"), async test2() { return Promise.reject("some err"); }, } : { test: () => Promise<{ count: number; } | StateMachine<{ count: number; }>>; test2(): Promise<{ count: number; } | StateMachine<{ count: number; }>>; }
26+
>services : { test: () => Promise<{ count: number; }>; test2(): Promise<{ count: number; }>; }
27+
>{ test: async () => Promise.reject("some err"), async test2() { return Promise.reject("some err"); }, } : { test: () => Promise<{ count: number; }>; test2(): Promise<{ count: number; }>; }
2828

2929
test: async () => Promise.reject("some err"),
30-
>test : () => Promise<{ count: number; } | StateMachine<{ count: number; }>>
31-
>async () => Promise.reject("some err") : () => Promise<{ count: number; } | StateMachine<{ count: number; }>>
32-
>Promise.reject("some err") : Promise<{ count: number; } | StateMachine<{ count: number; }>>
30+
>test : () => Promise<{ count: number; }>
31+
>async () => Promise.reject("some err") : () => Promise<{ count: number; }>
32+
>Promise.reject("some err") : Promise<{ count: number; }>
3333
>Promise.reject : <T = never>(reason?: any) => Promise<T>
3434
>Promise : PromiseConstructor
3535
>reject : <T = never>(reason?: any) => Promise<T>
3636
>"some err" : "some err"
3737

3838
async test2() {
39-
>test2 : () => Promise<{ count: number; } | StateMachine<{ count: number; }>>
39+
>test2 : () => Promise<{ count: number; }>
4040

4141
return Promise.reject("some err");
42-
>Promise.reject("some err") : Promise<{ count: number; } | StateMachine<{ count: number; }>>
42+
>Promise.reject("some err") : Promise<{ count: number; }>
4343
>Promise.reject : <T = never>(reason?: any) => Promise<T>
4444
>Promise : PromiseConstructor
4545
>reject : <T = never>(reason?: any) => Promise<T>
@@ -55,8 +55,8 @@ function fn1(): () => Promise<{ count: number }> | StateMachine<{ count: number
5555
>count : number
5656

5757
return async () => Promise.reject('some err')
58-
>async () => Promise.reject('some err') : () => Promise<{ count: number; } | StateMachine<{ count: number; }>>
59-
>Promise.reject('some err') : Promise<{ count: number; } | StateMachine<{ count: number; }>>
58+
>async () => Promise.reject('some err') : () => Promise<{ count: number; }>
59+
>Promise.reject('some err') : Promise<{ count: number; }>
6060
>Promise.reject : <T = never>(reason?: any) => Promise<T>
6161
>Promise : PromiseConstructor
6262
>reject : <T = never>(reason?: any) => Promise<T>

0 commit comments

Comments
 (0)