From ac03ba4f021fce5a78bcdde39952879d0a4f35eb Mon Sep 17 00:00:00 2001 From: magic-akari Date: Fri, 6 Jun 2025 07:37:47 +0800 Subject: [PATCH] fix(checker): report error when using bigint as enum key (#61777) --- src/compiler/checker.ts | 4 ++++ .../baselines/reference/enumWithBigint.errors.txt | 10 ++++++++++ tests/baselines/reference/enumWithBigint.js | 13 +++++++++++++ tests/baselines/reference/enumWithBigint.symbols | 10 ++++++++++ tests/baselines/reference/enumWithBigint.types | 14 ++++++++++++++ tests/cases/compiler/enumWithBigint.ts | 3 +++ 6 files changed, 54 insertions(+) create mode 100644 tests/baselines/reference/enumWithBigint.errors.txt create mode 100644 tests/baselines/reference/enumWithBigint.js create mode 100644 tests/baselines/reference/enumWithBigint.symbols create mode 100644 tests/baselines/reference/enumWithBigint.types create mode 100644 tests/cases/compiler/enumWithBigint.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index acfb4003c85..eff1b31cd92 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -481,6 +481,7 @@ import { isAssignmentTarget, isAutoAccessorPropertyDeclaration, isAwaitExpression, + isBigIntLiteral, isBinaryExpression, isBinaryLogicalOperator, isBindableObjectDefinePropertyCall, @@ -47541,6 +47542,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (isComputedNonLiteralName(member.name)) { error(member.name, Diagnostics.Computed_property_names_are_not_allowed_in_enums); } + else if (isBigIntLiteral(member.name)) { + error(member.name, Diagnostics.An_enum_member_cannot_have_a_numeric_name); + } else { const text = getTextOfPropertyName(member.name); if (isNumericLiteralName(text) && !isInfinityOrNaNString(text)) { diff --git a/tests/baselines/reference/enumWithBigint.errors.txt b/tests/baselines/reference/enumWithBigint.errors.txt new file mode 100644 index 00000000000..a88660ce7c7 --- /dev/null +++ b/tests/baselines/reference/enumWithBigint.errors.txt @@ -0,0 +1,10 @@ +enumWithBigint.ts(2,3): error TS2452: An enum member cannot have a numeric name. + + +==== enumWithBigint.ts (1 errors) ==== + enum E { + 0n = 0, + ~~ +!!! error TS2452: An enum member cannot have a numeric name. + } + \ No newline at end of file diff --git a/tests/baselines/reference/enumWithBigint.js b/tests/baselines/reference/enumWithBigint.js new file mode 100644 index 00000000000..9b8880af092 --- /dev/null +++ b/tests/baselines/reference/enumWithBigint.js @@ -0,0 +1,13 @@ +//// [tests/cases/compiler/enumWithBigint.ts] //// + +//// [enumWithBigint.ts] +enum E { + 0n = 0, +} + + +//// [enumWithBigint.js] +var E; +(function (E) { + E[E[0n] = 0] = 0n; +})(E || (E = {})); diff --git a/tests/baselines/reference/enumWithBigint.symbols b/tests/baselines/reference/enumWithBigint.symbols new file mode 100644 index 00000000000..7f1b4d87aa9 --- /dev/null +++ b/tests/baselines/reference/enumWithBigint.symbols @@ -0,0 +1,10 @@ +//// [tests/cases/compiler/enumWithBigint.ts] //// + +=== enumWithBigint.ts === +enum E { +>E : Symbol(E, Decl(enumWithBigint.ts, 0, 0)) + + 0n = 0, +>0n : Symbol(E[0n], Decl(enumWithBigint.ts, 0, 8)) +} + diff --git a/tests/baselines/reference/enumWithBigint.types b/tests/baselines/reference/enumWithBigint.types new file mode 100644 index 00000000000..8b38b838e6a --- /dev/null +++ b/tests/baselines/reference/enumWithBigint.types @@ -0,0 +1,14 @@ +//// [tests/cases/compiler/enumWithBigint.ts] //// + +=== enumWithBigint.ts === +enum E { +>E : E +> : ^ + + 0n = 0, +>0n : E.__missing +> : ^^^^^^^^^^^ +>0 : 0 +> : ^ +} + diff --git a/tests/cases/compiler/enumWithBigint.ts b/tests/cases/compiler/enumWithBigint.ts new file mode 100644 index 00000000000..0add71d1d8d --- /dev/null +++ b/tests/cases/compiler/enumWithBigint.ts @@ -0,0 +1,3 @@ +enum E { + 0n = 0, +}