diff --git a/packages/eslint-plugin/src/rules/no-unnecessary-condition.ts b/packages/eslint-plugin/src/rules/no-unnecessary-condition.ts index 6af9bc0e9e0..1d0ae09a49b 100644 --- a/packages/eslint-plugin/src/rules/no-unnecessary-condition.ts +++ b/packages/eslint-plugin/src/rules/no-unnecessary-condition.ts @@ -263,8 +263,14 @@ export default createRule({ function checkNodeForNullish(node: TSESTree.Expression): void { const type = getNodeType(node); - // Conditional is always necessary if it involves `any` or `unknown` - if (isTypeAnyType(type) || isTypeUnknownType(type)) { + + // Conditional is always necessary if it involves `any`, `unknown` or a naked type parameter + if ( + isTypeFlagSet( + type, + ts.TypeFlags.Any | ts.TypeFlags.Unknown | ts.TypeFlags.TypeParameter, + ) + ) { return; } 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 e3647102305..4cb0e1604b7 100644 --- a/packages/eslint-plugin/tests/rules/no-unnecessary-condition.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unnecessary-condition.test.ts @@ -280,6 +280,16 @@ function test(a: string | null | undefined) { ` function test(a: unknown) { return a ?? 'default'; +} + `, + ` +function test(a: T) { + return a ?? 'default'; +} + `, + ` +function test(a: T) { + return a ?? 'default'; } `, // Indexing cases @@ -827,6 +837,14 @@ function test(a: string) { code: ` function test(a: string | false) { return a ?? 'default'; +} + `, + errors: [ruleError(3, 10, 'neverNullish')], + }, + { + code: ` +function test(a: T) { + return a ?? 'default'; } `, errors: [ruleError(3, 10, 'neverNullish')], @@ -858,6 +876,14 @@ function test(a: null[]) { }, { code: ` +function test(a: T) { + return a ?? 'default'; +} + `, + errors: [ruleError(3, 10, 'alwaysNullish')], + }, + { + code: ` function test(a: never) { return a ?? 'default'; }