diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index da0b09cc781b2..565d01bf024dd 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -10033,6 +10033,10 @@ namespace ts { return isTypeAny(type) || isTypeOfKind(type, kind); } + function isInfinityOrNaNString(name: string): boolean { + return name === "Infinity" || name === "-Infinity" || name === "NaN"; + } + function isNumericLiteralName(name: string) { // The intent of numeric names is that // - they are names with text in a numeric form, and that @@ -16848,7 +16852,7 @@ namespace ts { } else { const text = getTextOfPropertyName(member.name); - if (isNumericLiteralName(text)) { + if (isNumericLiteralName(text) && !isInfinityOrNaNString(text)) { error(member.name, Diagnostics.An_enum_member_cannot_have_a_numeric_name); } } diff --git a/tests/baselines/reference/enumWithInfinityProperty.js b/tests/baselines/reference/enumWithInfinityProperty.js new file mode 100644 index 0000000000000..2ab45fbd9bec1 --- /dev/null +++ b/tests/baselines/reference/enumWithInfinityProperty.js @@ -0,0 +1,11 @@ +//// [enumWithInfinityProperty.ts] +enum A { + Infinity = 1 +} + + +//// [enumWithInfinityProperty.js] +var A; +(function (A) { + A[A["Infinity"] = 1] = "Infinity"; +})(A || (A = {})); diff --git a/tests/baselines/reference/enumWithInfinityProperty.symbols b/tests/baselines/reference/enumWithInfinityProperty.symbols new file mode 100644 index 0000000000000..50b505ce26225 --- /dev/null +++ b/tests/baselines/reference/enumWithInfinityProperty.symbols @@ -0,0 +1,8 @@ +=== tests/cases/compiler/enumWithInfinityProperty.ts === +enum A { +>A : Symbol(A, Decl(enumWithInfinityProperty.ts, 0, 0)) + + Infinity = 1 +>Infinity : Symbol(A.Infinity, Decl(enumWithInfinityProperty.ts, 0, 8)) +} + diff --git a/tests/baselines/reference/enumWithInfinityProperty.types b/tests/baselines/reference/enumWithInfinityProperty.types new file mode 100644 index 0000000000000..1f872916c15a3 --- /dev/null +++ b/tests/baselines/reference/enumWithInfinityProperty.types @@ -0,0 +1,9 @@ +=== tests/cases/compiler/enumWithInfinityProperty.ts === +enum A { +>A : A + + Infinity = 1 +>Infinity : A +>1 : number +} + diff --git a/tests/baselines/reference/enumWithNaNProperty.js b/tests/baselines/reference/enumWithNaNProperty.js new file mode 100644 index 0000000000000..ad3e5f3a7f210 --- /dev/null +++ b/tests/baselines/reference/enumWithNaNProperty.js @@ -0,0 +1,11 @@ +//// [enumWithNaNProperty.ts] +enum A { + NaN = 1 +} + + +//// [enumWithNaNProperty.js] +var A; +(function (A) { + A[A["NaN"] = 1] = "NaN"; +})(A || (A = {})); diff --git a/tests/baselines/reference/enumWithNaNProperty.symbols b/tests/baselines/reference/enumWithNaNProperty.symbols new file mode 100644 index 0000000000000..a327d74b17cd6 --- /dev/null +++ b/tests/baselines/reference/enumWithNaNProperty.symbols @@ -0,0 +1,8 @@ +=== tests/cases/compiler/enumWithNaNProperty.ts === +enum A { +>A : Symbol(A, Decl(enumWithNaNProperty.ts, 0, 0)) + + NaN = 1 +>NaN : Symbol(A.NaN, Decl(enumWithNaNProperty.ts, 0, 8)) +} + diff --git a/tests/baselines/reference/enumWithNaNProperty.types b/tests/baselines/reference/enumWithNaNProperty.types new file mode 100644 index 0000000000000..0d825a55eedc6 --- /dev/null +++ b/tests/baselines/reference/enumWithNaNProperty.types @@ -0,0 +1,9 @@ +=== tests/cases/compiler/enumWithNaNProperty.ts === +enum A { +>A : A + + NaN = 1 +>NaN : A +>1 : number +} + diff --git a/tests/baselines/reference/enumWithNegativeInfinityProperty.js b/tests/baselines/reference/enumWithNegativeInfinityProperty.js new file mode 100644 index 0000000000000..867545fb14aa9 --- /dev/null +++ b/tests/baselines/reference/enumWithNegativeInfinityProperty.js @@ -0,0 +1,11 @@ +//// [enumWithNegativeInfinityProperty.ts] +enum A { + "-Infinity" = 1 +} + + +//// [enumWithNegativeInfinityProperty.js] +var A; +(function (A) { + A[A["-Infinity"] = 1] = "-Infinity"; +})(A || (A = {})); diff --git a/tests/baselines/reference/enumWithNegativeInfinityProperty.symbols b/tests/baselines/reference/enumWithNegativeInfinityProperty.symbols new file mode 100644 index 0000000000000..51c61196ca6b6 --- /dev/null +++ b/tests/baselines/reference/enumWithNegativeInfinityProperty.symbols @@ -0,0 +1,7 @@ +=== tests/cases/compiler/enumWithNegativeInfinityProperty.ts === +enum A { +>A : Symbol(A, Decl(enumWithNegativeInfinityProperty.ts, 0, 0)) + + "-Infinity" = 1 +} + diff --git a/tests/baselines/reference/enumWithNegativeInfinityProperty.types b/tests/baselines/reference/enumWithNegativeInfinityProperty.types new file mode 100644 index 0000000000000..bc09333075d22 --- /dev/null +++ b/tests/baselines/reference/enumWithNegativeInfinityProperty.types @@ -0,0 +1,8 @@ +=== tests/cases/compiler/enumWithNegativeInfinityProperty.ts === +enum A { +>A : A + + "-Infinity" = 1 +>1 : number +} + diff --git a/tests/cases/compiler/enumWithInfinityProperty.ts b/tests/cases/compiler/enumWithInfinityProperty.ts new file mode 100644 index 0000000000000..6c9630705ede1 --- /dev/null +++ b/tests/cases/compiler/enumWithInfinityProperty.ts @@ -0,0 +1,3 @@ +enum A { + Infinity = 1 +} diff --git a/tests/cases/compiler/enumWithNaNProperty.ts b/tests/cases/compiler/enumWithNaNProperty.ts new file mode 100644 index 0000000000000..11636f0510c1f --- /dev/null +++ b/tests/cases/compiler/enumWithNaNProperty.ts @@ -0,0 +1,3 @@ +enum A { + NaN = 1 +} diff --git a/tests/cases/compiler/enumWithNegativeInfinityProperty.ts b/tests/cases/compiler/enumWithNegativeInfinityProperty.ts new file mode 100644 index 0000000000000..057c3a5e6691e --- /dev/null +++ b/tests/cases/compiler/enumWithNegativeInfinityProperty.ts @@ -0,0 +1,3 @@ +enum A { + "-Infinity" = 1 +}