From 58c7c25537485a5aa5b3398dd0400a2e08909b96 Mon Sep 17 00:00:00 2001 From: Alexander T Date: Thu, 16 Jan 2020 07:55:57 +0200 Subject: [PATCH] feat(eslint-plugin): [no-extra-!-assert] flag ?. after !-assert (#1460) --- .../docs/rules/no-extra-non-null-assertion.md | 12 +++++ .../src/rules/no-extra-non-null-assertion.ts | 12 +++-- .../rules/no-extra-non-null-assertion.test.ts | 49 +++++++++++++++++++ 3 files changed, 70 insertions(+), 3 deletions(-) diff --git a/packages/eslint-plugin/docs/rules/no-extra-non-null-assertion.md b/packages/eslint-plugin/docs/rules/no-extra-non-null-assertion.md index ced5d83ccb7..0991efdee52 100644 --- a/packages/eslint-plugin/docs/rules/no-extra-non-null-assertion.md +++ b/packages/eslint-plugin/docs/rules/no-extra-non-null-assertion.md @@ -15,6 +15,12 @@ function foo(bar: number | undefined) { } ``` +```ts +function foo(bar?: { n: number }) { + return bar!?.n; +} +``` + Examples of **correct** code for this rule: ```ts @@ -28,6 +34,12 @@ function foo(bar: number | undefined) { } ``` +```ts +function foo(bar?: { n: number }) { + return bar?.n; +} +``` + ## How to use ```json diff --git a/packages/eslint-plugin/src/rules/no-extra-non-null-assertion.ts b/packages/eslint-plugin/src/rules/no-extra-non-null-assertion.ts index cd116a3a4d7..39969de283f 100644 --- a/packages/eslint-plugin/src/rules/no-extra-non-null-assertion.ts +++ b/packages/eslint-plugin/src/rules/no-extra-non-null-assertion.ts @@ -1,4 +1,5 @@ import * as util from '../util'; +import { TSESTree } from '@typescript-eslint/experimental-utils'; export default util.createRule({ name: 'no-extra-non-null-assertion', @@ -16,10 +17,15 @@ export default util.createRule({ }, defaultOptions: [], create(context) { + function checkExtraNonNullAssertion( + node: TSESTree.TSNonNullExpression, + ): void { + context.report({ messageId: 'noExtraNonNullAssertion', node }); + } + return { - 'TSNonNullExpression > TSNonNullExpression'(node): void { - context.report({ messageId: 'noExtraNonNullAssertion', node }); - }, + 'TSNonNullExpression > TSNonNullExpression': checkExtraNonNullAssertion, + 'OptionalMemberExpression > TSNonNullExpression': checkExtraNonNullAssertion, }; }, }); diff --git a/packages/eslint-plugin/tests/rules/no-extra-non-null-assertion.test.ts b/packages/eslint-plugin/tests/rules/no-extra-non-null-assertion.test.ts index a851fe9a060..074dc90697e 100644 --- a/packages/eslint-plugin/tests/rules/no-extra-non-null-assertion.test.ts +++ b/packages/eslint-plugin/tests/rules/no-extra-non-null-assertion.test.ts @@ -19,6 +19,13 @@ function foo(bar: number | undefined) { const bar: number = bar!; } `, }, + { + code: ` +function foo(bar?: { n: number }) { + return bar?.n; +} + `, + }, ], invalid: [ { @@ -62,5 +69,47 @@ function foo(bar: number | undefined) { }, ], }, + { + code: ` +function foo(bar?: { n: number }) { + return bar!?.n; +} + `, + errors: [ + { + messageId: 'noExtraNonNullAssertion', + endColumn: 14, + column: 10, + line: 3, + }, + ], + }, + { + code: ` +function foo(bar?: { n: number }) { + return bar!!!?.n; +} + `, + errors: [ + { + messageId: 'noExtraNonNullAssertion', + endColumn: 16, + column: 10, + line: 3, + }, + { + messageId: 'noExtraNonNullAssertion', + endColumn: 15, + column: 10, + line: 3, + }, + { + messageId: 'noExtraNonNullAssertion', + endColumn: 14, + column: 10, + line: 3, + }, + ], + }, ], });