From 412e611648f40edad04b9046a46ca2e78afbf176 Mon Sep 17 00:00:00 2001 From: Evgeny Stepanovych Date: Sun, 31 Jul 2022 23:16:15 +0200 Subject: [PATCH 1/2] feat(eslint-plugin): [prefer-as-const] adds support for class properties --- .../src/rules/prefer-as-const.ts | 5 +++ .../tests/rules/prefer-as-const.test.ts | 33 +++++++++++++++++-- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/packages/eslint-plugin/src/rules/prefer-as-const.ts b/packages/eslint-plugin/src/rules/prefer-as-const.ts index ca6b9921656..3d4a3ec9fea 100644 --- a/packages/eslint-plugin/src/rules/prefer-as-const.ts +++ b/packages/eslint-plugin/src/rules/prefer-as-const.ts @@ -65,6 +65,11 @@ export default util.createRule({ TSTypeAssertion(node): void { compareTypes(node.expression, node.typeAnnotation, true); }, + PropertyDefinition(node): void { + if (node.value && node.typeAnnotation) { + compareTypes(node.value, node.typeAnnotation.typeAnnotation, false); + } + }, VariableDeclarator(node): void { if (node.init && node.id.typeAnnotation) { compareTypes(node.init, node.id.typeAnnotation.typeAnnotation, false); diff --git a/packages/eslint-plugin/tests/rules/prefer-as-const.test.ts b/packages/eslint-plugin/tests/rules/prefer-as-const.test.ts index d5c15474f69..e7f16c5bb3e 100644 --- a/packages/eslint-plugin/tests/rules/prefer-as-const.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-as-const.test.ts @@ -25,12 +25,12 @@ ruleTester.run('prefer-as-const', rule, { "let foo = 'bar';", ` class foo { - bar: 'baz' = 'baz'; + bar = 'baz'; } `, ` class foo { - bar = 'baz'; + bar: 'baz'; } `, "let foo: 'bar';", @@ -160,5 +160,34 @@ ruleTester.run('prefer-as-const', rule, { }, ], }, + { + code: ` +class foo { + bar: 'baz' = 'baz'; +} + `.trimRight(), + output: ` +class foo { + bar: 'baz' = 'baz'; +} + `.trimRight(), + errors: [ + { + messageId: 'variableConstAssertion', + line: 3, + column: 8, + suggestions: [ + { + messageId: 'variableSuggest', + output: ` +class foo { + bar = 'baz' as const; +} + `.trimRight(), + }, + ], + }, + ], + }, ], }); From 4c18ac75c59a65cdff4ee4f829903dac43253e24 Mon Sep 17 00:00:00 2001 From: Evgeny Stepanovych Date: Mon, 1 Aug 2022 20:17:13 +0200 Subject: [PATCH 2/2] feat(eslint-plugin): [prefer-as-const] adds support for class properties --- .../tests/rules/prefer-as-const.test.ts | 144 +++++++++++++++++- 1 file changed, 141 insertions(+), 3 deletions(-) diff --git a/packages/eslint-plugin/tests/rules/prefer-as-const.test.ts b/packages/eslint-plugin/tests/rules/prefer-as-const.test.ts index e7f16c5bb3e..b31499f4e8a 100644 --- a/packages/eslint-plugin/tests/rules/prefer-as-const.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-as-const.test.ts @@ -23,6 +23,9 @@ ruleTester.run('prefer-as-const', rule, { 'let foo: number = 1;', "let foo: 'bar' = baz;", "let foo = 'bar';", + "let foo: 'bar';", + 'let foo = { bar };', + "let foo: 'baz' = 'baz' as const;", ` class foo { bar = 'baz'; @@ -33,9 +36,58 @@ ruleTester.run('prefer-as-const', rule, { bar: 'baz'; } `, - "let foo: 'bar';", - 'let foo = { bar };', - "let foo: 'baz' = 'baz' as const;", + ` + class foo { + bar; + } + `, + ` + class foo { + bar = 'baz'; + } + `, + ` + class foo { + bar: string = 'baz'; + } + `, + ` + class foo { + bar: number = 1; + } + `, + ` + class foo { + bar = 'baz' as const; + } + `, + ` + class foo { + bar = 2 as const; + } + `, + ` + class foo { + get bar(): 'bar' {} + set bar(bar: 'bar') {} + } + `, + ` + class foo { + bar = () => 'bar' as const; + } + `, + ` + type BazFunction = () => 'baz'; + class foo { + bar: BazFunction = () => 'bar'; + } + `, + ` + class foo { + bar(): void {} + } + `, ], invalid: [ { @@ -189,5 +241,91 @@ class foo { }, ], }, + { + code: ` +class foo { + bar: 2 = 2; +} + `.trimRight(), + output: ` +class foo { + bar: 2 = 2; +} + `.trimRight(), + errors: [ + { + messageId: 'variableConstAssertion', + line: 3, + column: 8, + suggestions: [ + { + messageId: 'variableSuggest', + output: ` +class foo { + bar = 2 as const; +} + `.trimRight(), + }, + ], + }, + ], + }, + { + code: ` +class foo { + foo = <'bar'>'bar'; +} + `.trimRight(), + output: ` +class foo { + foo = 'bar'; +} + `.trimRight(), + errors: [ + { + messageId: 'preferConstAssertion', + line: 3, + column: 10, + }, + ], + }, + { + code: ` +class foo { + foo = 'bar' as 'bar'; +} + `.trimRight(), + output: ` +class foo { + foo = 'bar' as const; +} + `.trimRight(), + errors: [ + { + messageId: 'preferConstAssertion', + line: 3, + column: 18, + }, + ], + }, + { + code: ` +class foo { + foo = 5 as 5; +} + `.trimRight(), + output: ` +class foo { + foo = 5 as const; +} + `.trimRight(), + errors: [ + { + messageId: 'preferConstAssertion', + line: 3, + column: 14, + }, + ], + }, ], });