From 111c244c3eb157efeb5c43ff39f12633b27f091e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arnaud=20Barr=C3=A9?= Date: Tue, 17 Nov 2020 04:30:20 +0100 Subject: [PATCH] fix(eslint-plugin): [no-unnecessary-condition] false positive when array predicate returns unknown (#2772) --- .../eslint-plugin/src/rules/no-unnecessary-condition.ts | 4 ++++ .../tests/rules/no-unnecessary-condition.test.ts | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/packages/eslint-plugin/src/rules/no-unnecessary-condition.ts b/packages/eslint-plugin/src/rules/no-unnecessary-condition.ts index 3e1ad26bcda..aee4963a0c0 100644 --- a/packages/eslint-plugin/src/rules/no-unnecessary-condition.ts +++ b/packages/eslint-plugin/src/rules/no-unnecessary-condition.ts @@ -450,6 +450,10 @@ export default createRule({ // Not a callable function return; } + // Predicate is always necessary if it involves `any` or `unknown` + if (returnTypes.some(t => isTypeAnyType(t) || isTypeUnknownType(t))) { + return; + } if (!returnTypes.some(isPossiblyFalsy)) { return context.report({ node: callback, diff --git a/packages/eslint-plugin/tests/rules/no-unnecessary-condition.test.ts b/packages/eslint-plugin/tests/rules/no-unnecessary-condition.test.ts index 2afba392673..2658061a357 100644 --- a/packages/eslint-plugin/tests/rules/no-unnecessary-condition.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unnecessary-condition.test.ts @@ -235,6 +235,14 @@ function length(x: string) { function nonEmptyStrings(x: string[]) { return x.filter(length); } + +// filter-like predicate +function count( + list: string[], + predicate: (value: string, index: number, array: string[]) => unknown, +) { + return list.filter(predicate).length; +} `, // Ignores non-array methods of the same name `