diff --git a/packages/eslint-plugin/src/rules/await-thenable.ts b/packages/eslint-plugin/src/rules/await-thenable.ts index 8c84eacc8788..70c87cc5d918 100644 --- a/packages/eslint-plugin/src/rules/await-thenable.ts +++ b/packages/eslint-plugin/src/rules/await-thenable.ts @@ -111,7 +111,7 @@ export default createRule<[], MessageId>({ const type = getConstrainedTypeAtLocation(services, element); const tsNode = services.esTreeNodeToTSNodeMap.get(element); - if (containsNonAwaitableType(type, tsNode, checker)) { + if (isAlwaysNonAwaitableType(type, tsNode, checker)) { context.report({ node: element, messageId: 'invalidPromiseAggregatorInput', @@ -281,6 +281,19 @@ function getValueTypesOfArrayLike( return null; } +function isAlwaysNonAwaitableType( + type: ts.Type, + node: ts.Node, + checker: ts.TypeChecker, +): boolean { + return tsutils + .unionConstituents(type) + .every( + typeArgumentPart => + needsToBeAwaited(checker, node, typeArgumentPart) === Awaitable.Never, + ); +} + function containsNonAwaitableType( type: ts.Type, node: ts.Node, diff --git a/packages/eslint-plugin/tests/rules/await-thenable.test.ts b/packages/eslint-plugin/tests/rules/await-thenable.test.ts index f1729d908bdb..0556ce4803de 100644 --- a/packages/eslint-plugin/tests/rules/await-thenable.test.ts +++ b/packages/eslint-plugin/tests/rules/await-thenable.test.ts @@ -683,6 +683,18 @@ Promise.all([ Promise.resolve(2), Promise.resolve(3), ...[Promise.resolve(4), Promise.resolve(5), Promise.resolve(6)], +]); + `, + }, + { + code: ` +declare const maybePromise: Promise | number; + +Promise.all([ + maybePromise, + Promise.resolve(1), + Promise.resolve(2), + Promise.resolve(3), ]); `, },