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 `