From b63de767bc28bd334ee61e6c154dfa701700eef8 Mon Sep 17 00:00:00 2001 From: lonyele Date: Fri, 24 Dec 2021 16:34:57 +0900 Subject: [PATCH] fix: handle class sharp private field and member --- .../eslint-plugin/src/util/propertyTypes.ts | 17 ++++++++++++++++- .../prefer-readonly-parameter-types.test.ts | 15 +++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/packages/eslint-plugin/src/util/propertyTypes.ts b/packages/eslint-plugin/src/util/propertyTypes.ts index 5e2f1054239d..09e04b9049d1 100644 --- a/packages/eslint-plugin/src/util/propertyTypes.ts +++ b/packages/eslint-plugin/src/util/propertyTypes.ts @@ -7,7 +7,7 @@ export function getTypeOfPropertyOfName( escapedName?: ts.__String, ): ts.Type | undefined { // Most names are directly usable in the checker and aren't different from escaped names - if (!escapedName || !name.startsWith('__')) { + if (!escapedName || !isSymbol(escapedName)) { return checker.getTypeOfPropertyOfType(type, name); } @@ -34,3 +34,18 @@ export function getTypeOfPropertyOfType( property.getEscapedName(), ); } + +// Symbolic names need to be specially handled because TS api is not sufficient for these cases. +function isSymbol(escapedName: string): boolean { + return isKnownSymbol(escapedName) || isPrivateIdentifierSymbol(escapedName); +} + +// case for escapedName: "__@foo@10", name: "__@foo@10" +function isKnownSymbol(escapedName: string): boolean { + return escapedName.startsWith('__@'); +} + +// case for escapedName: "__#1@#foo", name: "#foo" +function isPrivateIdentifierSymbol(escapedName: string): boolean { + return escapedName.startsWith('__#'); +} diff --git a/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts b/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts index be50f096963a..e178bafd5ffb 100644 --- a/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts @@ -222,6 +222,21 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { }, ], }, + // PrivateIdentifier is handled without throwing error. + { + code: ` + class Foo { + readonly #privateField = 'foo'; + #privateMember() {} + } + function foo(arg: Foo) {} + `, + options: [ + { + treatMethodsAsReadonly: true, + }, + ], + }, // parameter properties should work fine {