diff --git a/packages/eslint-plugin/src/rules/no-unnecessary-type-conversion.ts b/packages/eslint-plugin/src/rules/no-unnecessary-type-conversion.ts index 088b8768b3af..d18f7617acfc 100644 --- a/packages/eslint-plugin/src/rules/no-unnecessary-type-conversion.ts +++ b/packages/eslint-plugin/src/rules/no-unnecessary-type-conversion.ts @@ -19,6 +19,18 @@ type MessageIds = | 'suggestSatisfies' | 'unnecessaryTypeConversion'; +function isEnumType(type: ts.Type): boolean { + return (type.getFlags() & ts.TypeFlags.EnumLike) !== 0; +} + +function isEnumMemberType(type: ts.Type): boolean { + const symbol = type.getSymbol(); + if (!symbol) { + return false; + } + return (symbol.flags & ts.SymbolFlags.EnumMember) !== 0; +} + export default createRule({ name: 'no-unnecessary-type-conversion', meta: { @@ -294,6 +306,11 @@ export default createRule({ ): void { const memberExpr = node.parent as TSESTree.MemberExpression; const type = getConstrainedTypeAtLocation(services, memberExpr.object); + + if (isEnumType(type) || isEnumMemberType(type)) { + return; + } + if (doesUnderlyingTypeMatchFlag(type, ts.TypeFlags.StringLike)) { const wrappingFixerParams = { node: memberExpr.parent, diff --git a/packages/eslint-plugin/tests/rules/no-unnecessary-type-conversion.test.ts b/packages/eslint-plugin/tests/rules/no-unnecessary-type-conversion.test.ts index 50995fb3a90d..71f5e56e0d1a 100644 --- a/packages/eslint-plugin/tests/rules/no-unnecessary-type-conversion.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unnecessary-type-conversion.test.ts @@ -97,6 +97,14 @@ ruleTester.run('no-unnecessary-type-conversion', rule, { '~~new Number();', 'Boolean(new Boolean());', '!!new Boolean();', + ` + enum CustomIds { + Id1 = 'id1', + Id2 = 'id2', + } + const customId = 'id1'; + const compareWithToString = customId === CustomIds.Id1.toString(); + `, ], invalid: [