From 5d7b0ea1639ad16cd24baa6222cf7e1acebec96d Mon Sep 17 00:00:00 2001 From: Brad Zacher Date: Tue, 12 Nov 2019 18:02:36 -0800 Subject: [PATCH] fix(eslint-plugin): [nuta] correctly handle null/undefined separation --- .../src/rules/no-unnecessary-type-assertion.ts | 15 +++++++++++---- .../rules/no-unnecessary-type-assertion.test.ts | 11 +++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) 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 61583878bae9..141959ca7afd 100644 --- a/packages/eslint-plugin/src/rules/no-unnecessary-type-assertion.ts +++ b/packages/eslint-plugin/src/rules/no-unnecessary-type-assertion.ts @@ -216,10 +216,17 @@ export default util.createRule({ contextualType, ts.TypeFlags.Null, ); - if ( - (typeIncludesUndefined && contextualTypeIncludesUndefined) || - (typeIncludesNull && contextualTypeIncludesNull) - ) { + + // make sure that the parent accepts the same types + // i.e. assigning `string | null | undefined` to `string | undefined` is invalid + const isValidUndefined = typeIncludesUndefined + ? contextualTypeIncludesUndefined + : true; + const isValidNull = typeIncludesNull + ? contextualTypeIncludesNull + : true; + + if (isValidUndefined && isValidNull) { context.report({ node, messageId: 'contextuallyUnnecessary', 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 4b4e496253f5..73a8619b6a48 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 @@ -104,6 +104,17 @@ class Mx { private prop = 1; } `, + // https://github.com/typescript-eslint/typescript-eslint/issues/1199 + ` +function testFunction(_param: string | undefined): void { /* noop */ } +const value = 'test' as string | null | undefined +testFunction(value!) + `, + ` +function testFunction(_param: string | null): void { /* noop */ } +const value = 'test' as string | null | undefined +testFunction(value!) + `, ], invalid: [