@@ -800,6 +800,7 @@ namespace ts {
800800 let deferredGlobalESSymbolConstructorSymbol: Symbol | undefined;
801801 let deferredGlobalESSymbolType: ObjectType;
802802 let deferredGlobalTypedPropertyDescriptorType: GenericType;
803+ let deferredGlobalAwaitedSymbol: Symbol | undefined;
803804 let deferredGlobalPromiseType: GenericType;
804805 let deferredGlobalPromiseLikeType: GenericType;
805806 let deferredGlobalPromiseConstructorSymbol: Symbol | undefined;
@@ -853,7 +854,6 @@ namespace ts {
853854 const flowNodeReachable: (boolean | undefined)[] = [];
854855 const potentialThisCollisions: Node[] = [];
855856 const potentialNewTargetCollisions: Node[] = [];
856- const awaitedTypeStack: number[] = [];
857857
858858 const diagnostics = createDiagnosticCollection();
859859 const suggestionDiagnostics = createDiagnosticCollection();
@@ -11070,6 +11070,10 @@ namespace ts {
1107011070 return deferredGlobalESSymbolType || (deferredGlobalESSymbolType = getGlobalType("Symbol" as __String, /*arity*/ 0, reportErrors)) || emptyObjectType;
1107111071 }
1107211072
11073+ function getGlobalAwaitedSymbol(reportErrors: boolean) {
11074+ return deferredGlobalAwaitedSymbol || (deferredGlobalAwaitedSymbol = getGlobalTypeSymbol("Awaited" as __String, reportErrors));
11075+ }
11076+
1107311077 function getGlobalPromiseType(reportErrors: boolean) {
1107411078 return deferredGlobalPromiseType || (deferredGlobalPromiseType = getGlobalType("Promise" as __String, /*arity*/ 1, reportErrors)) || emptyGenericType;
1107511079 }
@@ -29013,98 +29017,22 @@ namespace ts {
2901329017 return typeAsAwaitable.awaitedTypeOfType = type;
2901429018 }
2901529019
29016- if (type.flags & TypeFlags.Union) {
29017- let types: Type[] | undefined;
29018- for (const constituentType of (<UnionType>type).types) {
29019- types = append<Type>(types, getAwaitedType(constituentType, errorNode, diagnosticMessage, arg0));
29020- }
29021-
29022- if (!types) {
29023- return undefined;
29024- }
29025-
29026- return typeAsAwaitable.awaitedTypeOfType = getUnionType(types);
29020+ const symbol = getGlobalAwaitedSymbol(/*reportErrors*/ false);
29021+ if (!symbol) {
29022+ return typeAsAwaitable.awaitedTypeOfType = type;
2902729023 }
2902829024
29029- const promisedType = getPromisedTypeOfPromise(type);
29030- if (promisedType) {
29031- if (type.id === promisedType.id || awaitedTypeStack.indexOf(promisedType.id) >= 0) {
29032- // Verify that we don't have a bad actor in the form of a promise whose
29033- // promised type is the same as the promise type, or a mutually recursive
29034- // promise. If so, we return undefined as we cannot guess the shape. If this
29035- // were the actual case in the JavaScript, this Promise would never resolve.
29036- //
29037- // An example of a bad actor with a singly-recursive promise type might
29038- // be:
29039- //
29040- // interface BadPromise {
29041- // then(
29042- // onfulfilled: (value: BadPromise) => any,
29043- // onrejected: (error: any) => any): BadPromise;
29044- // }
29045- // The above interface will pass the PromiseLike check, and return a
29046- // promised type of `BadPromise`. Since this is a self reference, we
29047- // don't want to keep recursing ad infinitum.
29048- //
29049- // An example of a bad actor in the form of a mutually-recursive
29050- // promise type might be:
29051- //
29052- // interface BadPromiseA {
29053- // then(
29054- // onfulfilled: (value: BadPromiseB) => any,
29055- // onrejected: (error: any) => any): BadPromiseB;
29056- // }
29057- //
29058- // interface BadPromiseB {
29059- // then(
29060- // onfulfilled: (value: BadPromiseA) => any,
29061- // onrejected: (error: any) => any): BadPromiseA;
29062- // }
29063- //
29064- if (errorNode) {
29065- error(errorNode, Diagnostics.Type_is_referenced_directly_or_indirectly_in_the_fulfillment_callback_of_its_own_then_method);
29066- }
29067- return undefined;
29068- }
29069-
29070- // Keep track of the type we're about to unwrap to avoid bad recursive promise types.
29071- // See the comments above for more information.
29072- awaitedTypeStack.push(type.id);
29073- const awaitedType = getAwaitedType(promisedType, errorNode, diagnosticMessage, arg0);
29074- awaitedTypeStack.pop();
29075-
29076- if (!awaitedType) {
29077- return undefined;
29078- }
29079-
29080- return typeAsAwaitable.awaitedTypeOfType = awaitedType;
29025+ const result = getTypeAliasInstantiation(symbol, [type]);
29026+ if (result !== unknownType || type === unknownType || getPromisedTypeOfPromise(type) === unknownType) {
29027+ return typeAsAwaitable.awaitedTypeOfType = (result as PromiseOrAwaitableType).awaitedTypeOfType = result;
2908129028 }
2908229029
29083- // The type was not a promise, so it could not be unwrapped any further.
29084- // As long as the type does not have a callable "then" property, it is
29085- // safe to return the type; otherwise, an error will be reported in
29086- // the call to getNonThenableType and we will return undefined.
29087- //
29088- // An example of a non-promise "thenable" might be:
29089- //
29090- // await { then(): void {} }
29091- //
29092- // The "thenable" does not match the minimal definition for a promise. When
29093- // a Promise/A+-compatible or ES6 promise tries to adopt this value, the promise
29094- // will never settle. We treat this as an error to help flag an early indicator
29095- // of a runtime problem. If the user wants to return this value from an async
29096- // function, they would need to wrap it in some other value. If they want it to
29097- // be treated as a promise, they can cast to <any>.
29098- const thenFunction = getTypeOfPropertyOfType(type, "then" as __String);
29099- if (thenFunction && getSignaturesOfType(thenFunction, SignatureKind.Call).length > 0) {
29100- if (errorNode) {
29101- if (!diagnosticMessage) return Debug.fail();
29102- error(errorNode, diagnosticMessage, arg0);
29103- }
29104- return undefined;
29030+ if (errorNode) {
29031+ if (!diagnosticMessage) return Debug.fail();
29032+ error(errorNode, diagnosticMessage, arg0);
2910529033 }
2910629034
29107- return typeAsAwaitable.awaitedTypeOfType = type ;
29035+ return undefined ;
2910829036 }
2910929037
2911029038 /**
0 commit comments