diff --git a/packages/eslint-plugin/src/rules/no-unnecessary-type-assertion.ts b/packages/eslint-plugin/src/rules/no-unnecessary-type-assertion.ts index 83c8afe9b78c..4e26d6e20aa2 100644 --- a/packages/eslint-plugin/src/rules/no-unnecessary-type-assertion.ts +++ b/packages/eslint-plugin/src/rules/no-unnecessary-type-assertion.ts @@ -349,6 +349,13 @@ export default createRule({ const contextualType = getContextualType(checker, originalNode); if (contextualType) { + if ( + isTypeFlagSet(type, ts.TypeFlags.Unknown) && + !isTypeFlagSet(contextualType, ts.TypeFlags.Unknown) + ) { + return; + } + // in strict mode you can't assign null to undefined, so we have to make sure that // the two types share a nullable type const typeIncludesUndefined = isTypeFlagSet( diff --git a/packages/eslint-plugin/tests/rules/no-unnecessary-type-assertion.test.ts b/packages/eslint-plugin/tests/rules/no-unnecessary-type-assertion.test.ts index 1ef1a3dfb371..c28260e79b4a 100644 --- a/packages/eslint-plugin/tests/rules/no-unnecessary-type-assertion.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unnecessary-type-assertion.test.ts @@ -416,6 +416,19 @@ enum T { const b = 1 as T.Value2; `, }, + ` +const foo: unknown = {}; +const baz: {} = foo!; + `, + ` +const foo: unknown = {}; +const bar: object = foo!; + `, + ` +declare function foo(bar: T): T; +const baz: unknown = {}; +foo(baz!); + `, ], invalid: [ @@ -1335,5 +1348,37 @@ declare const a: T.Value1; const b = a; `, }, + { + code: ` +const foo: unknown = {}; +const bar: unknown = foo!; + `, + errors: [ + { + messageId: 'contextuallyUnnecessary', + }, + ], + output: ` +const foo: unknown = {}; +const bar: unknown = foo; + `, + }, + { + code: ` +function foo(bar: unknown) {} +const baz: unknown = {}; +foo(baz!); + `, + errors: [ + { + messageId: 'contextuallyUnnecessary', + }, + ], + output: ` +function foo(bar: unknown) {} +const baz: unknown = {}; +foo(baz); + `, + }, ], });