From 4888a0d5df0e8c2f3c3febff3b5f09f994483b82 Mon Sep 17 00:00:00 2001 From: yeonjuan Date: Fri, 23 Feb 2024 01:37:39 +0900 Subject: [PATCH 1/2] fix(eslint-plugin): [no-misused-promises] improve check union types --- .../eslint-plugin/src/rules/no-misused-promises.ts | 4 ++++ .../tests/rules/no-misused-promises.test.ts | 13 +++++++++++++ 2 files changed, 17 insertions(+) diff --git a/packages/eslint-plugin/src/rules/no-misused-promises.ts b/packages/eslint-plugin/src/rules/no-misused-promises.ts index fa5f9ae5796b..c631b800a144 100644 --- a/packages/eslint-plugin/src/rules/no-misused-promises.ts +++ b/packages/eslint-plugin/src/rules/no-misused-promises.ts @@ -675,6 +675,10 @@ function isVoidReturningFunctionType( function returnsThenable(checker: ts.TypeChecker, node: ts.Node): boolean { const type = checker.getApparentType(checker.getTypeAtLocation(node)); + if (type.isUnion()) { + return type.types.some(t => anySignatureIsThenableType(checker, node, t)); + } + if (anySignatureIsThenableType(checker, node, type)) { return true; } diff --git a/packages/eslint-plugin/tests/rules/no-misused-promises.test.ts b/packages/eslint-plugin/tests/rules/no-misused-promises.test.ts index a6d6f1db5ad2..977639e37f6f 100644 --- a/packages/eslint-plugin/tests/rules/no-misused-promises.test.ts +++ b/packages/eslint-plugin/tests/rules/no-misused-promises.test.ts @@ -474,6 +474,11 @@ restTuple('Hello'); }; } `, + ` +declare function foo(cb: undefined | (() => void)); +declare const bar: undefined | (() => void); +foo(bar); + `, // https://github.com/typescript-eslint/typescript-eslint/issues/6637 { code: ` @@ -1227,5 +1232,13 @@ const test: ReturnsRecord = () => { `, errors: [{ line: 7, messageId: 'voidReturnProperty' }], }, + { + code: ` +declare function foo(cb: undefined | (() => void)); +declare const bar: undefined | (() => Promise); +foo(bar); + `, + errors: [{ line: 4, messageId: 'voidReturnArgument' }], + }, ], }); From a5c08f4ea49434eea98c7d37ec415658e0e7a8b4 Mon Sep 17 00:00:00 2001 From: yeonjuan Date: Fri, 23 Feb 2024 20:58:09 +0900 Subject: [PATCH 2/2] apply reviews --- .../eslint-plugin/src/rules/no-misused-promises.ts | 13 +++---------- .../tests/rules/no-misused-promises.test.ts | 8 ++++++++ 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/packages/eslint-plugin/src/rules/no-misused-promises.ts b/packages/eslint-plugin/src/rules/no-misused-promises.ts index c631b800a144..b7d556c893f0 100644 --- a/packages/eslint-plugin/src/rules/no-misused-promises.ts +++ b/packages/eslint-plugin/src/rules/no-misused-promises.ts @@ -674,14 +674,7 @@ function isVoidReturningFunctionType( */ function returnsThenable(checker: ts.TypeChecker, node: ts.Node): boolean { const type = checker.getApparentType(checker.getTypeAtLocation(node)); - - if (type.isUnion()) { - return type.types.some(t => anySignatureIsThenableType(checker, node, t)); - } - - if (anySignatureIsThenableType(checker, node, type)) { - return true; - } - - return false; + return tsutils + .unionTypeParts(type) + .some(t => anySignatureIsThenableType(checker, node, t)); } diff --git a/packages/eslint-plugin/tests/rules/no-misused-promises.test.ts b/packages/eslint-plugin/tests/rules/no-misused-promises.test.ts index 977639e37f6f..1910dd4f93f9 100644 --- a/packages/eslint-plugin/tests/rules/no-misused-promises.test.ts +++ b/packages/eslint-plugin/tests/rules/no-misused-promises.test.ts @@ -1236,6 +1236,14 @@ const test: ReturnsRecord = () => { code: ` declare function foo(cb: undefined | (() => void)); declare const bar: undefined | (() => Promise); +foo(bar); + `, + errors: [{ line: 4, messageId: 'voidReturnArgument' }], + }, + { + code: ` +declare function foo(cb: string & (() => void)); +declare const bar: string & (() => Promise); foo(bar); `, errors: [{ line: 4, messageId: 'voidReturnArgument' }],