From 9b0e5ef092de4e8f58115425cd9631adb205e479 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Wed, 20 Apr 2022 08:28:37 -0400 Subject: [PATCH 1/2] fix(eslint-plugin): prioritize false returns when checking whether a function returns only void --- .../eslint-plugin/src/rules/no-misused-promises.ts | 9 +++++---- .../tests/rules/no-misused-promises.test.ts | 12 ++++++++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/packages/eslint-plugin/src/rules/no-misused-promises.ts b/packages/eslint-plugin/src/rules/no-misused-promises.ts index 5ef86bff0a8c..03b166ec49b0 100644 --- a/packages/eslint-plugin/src/rules/no-misused-promises.ts +++ b/packages/eslint-plugin/src/rules/no-misused-promises.ts @@ -537,6 +537,8 @@ function isVoidReturningFunctionType( node: ts.Node, type: ts.Type, ): boolean { + let hadVoidReturn = false; + for (const subType of tsutils.unionTypeParts(type)) { for (const signature of subType.getCallSignatures()) { const returnType = signature.getReturnType(); @@ -547,12 +549,11 @@ function isVoidReturningFunctionType( return false; } - if (tsutils.isTypeFlagSet(returnType, ts.TypeFlags.Void)) { - return true; - } + hadVoidReturn ||= tsutils.isTypeFlagSet(returnType, ts.TypeFlags.Void); } } - return false; + + return hadVoidReturn; } /** 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 f643f4d91e1c..44703b84d003 100644 --- a/packages/eslint-plugin/tests/rules/no-misused-promises.test.ts +++ b/packages/eslint-plugin/tests/rules/no-misused-promises.test.ts @@ -304,6 +304,18 @@ declare const it: ItLike; it('', async () => {}); `, }, + { + code: ` +interface Props { + onEvent: (() => void) | (() => Promise); +} + +const Component: React.FC = () => null; + +const _ = {}} />; + `, + filename: 'react.tsx', + }, ], invalid: [ From 1e3af132bee9c893635ddc85d5999d85f7feaf36 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Fri, 22 Apr 2022 13:17:50 -0400 Subject: [PATCH 2/2] Update packages/eslint-plugin/tests/rules/no-misused-promises.test.ts Co-authored-by: Brad Zacher --- packages/eslint-plugin/tests/rules/no-misused-promises.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 44703b84d003..518b7c1d6b5d 100644 --- a/packages/eslint-plugin/tests/rules/no-misused-promises.test.ts +++ b/packages/eslint-plugin/tests/rules/no-misused-promises.test.ts @@ -310,7 +310,7 @@ interface Props { onEvent: (() => void) | (() => Promise); } -const Component: React.FC = () => null; +declare function Component(props: Props): any; const _ = {}} />; `,