From a50acaf638a82b1081981589f42d6ce461636345 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Thu, 7 Mar 2024 10:50:59 -0800 Subject: [PATCH 1/6] Ensure enum members syntactically determinable to be strings do not get reverse mappings. Co-authored-by: frigus02 <3579251+frigus02@users.noreply.github.com> --- src/compiler/transformers/ts.ts | 3 ++- src/compiler/utilities.ts | 20 +++++++++++++++++++ ...edEnumMemberSyntacticallyString.errors.txt | 16 +++++++++++++++ .../computedEnumMemberSyntacticallyString.js | 18 +++++++++++++++++ .../computedEnumMemberSyntacticallyString.ts | 9 +++++++++ 5 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/computedEnumMemberSyntacticallyString.errors.txt create mode 100644 tests/baselines/reference/computedEnumMemberSyntacticallyString.js create mode 100644 tests/cases/compiler/computedEnumMemberSyntacticallyString.ts diff --git a/src/compiler/transformers/ts.ts b/src/compiler/transformers/ts.ts index 6cc1db763806b..7680adf8ada1e 100644 --- a/src/compiler/transformers/ts.ts +++ b/src/compiler/transformers/ts.ts @@ -122,6 +122,7 @@ import { isSimpleInlineableExpression, isSourceFile, isStatement, + isSyntacticallyString, isTemplateLiteral, isTryStatement, JsxOpeningElement, @@ -1922,7 +1923,7 @@ export function transformTypeScript(context: TransformationContext) { ), valueExpression, ); - const outerAssignment = valueExpression.kind === SyntaxKind.StringLiteral ? + const outerAssignment = isSyntacticallyString(valueExpression) ? innerAssignment : factory.createAssignment( factory.createElementAccessExpression( diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 6bbc51a4ad121..eef53dc6089d1 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -10639,3 +10639,23 @@ export function replaceFirstStar(s: string, replacement: string): string { export function getNameFromImportAttribute(node: ImportAttribute) { return isIdentifier(node.name) ? node.name.escapedText : escapeLeadingUnderscores(node.name.text); } + +/** @internal */ +export function isSyntacticallyString(expr: Expression): boolean { + switch (expr.kind) { + case SyntaxKind.BinaryExpression: + const left = (expr as BinaryExpression).left; + const right = (expr as BinaryExpression).right; + return ( + (expr as BinaryExpression).operatorToken.kind === SyntaxKind.PlusToken && + (isSyntacticallyString(left) || isSyntacticallyString(right)) + ); + case SyntaxKind.ParenthesizedExpression: + return isSyntacticallyString((expr as ParenthesizedExpression).expression); + case SyntaxKind.TemplateExpression: + case SyntaxKind.StringLiteral: + case SyntaxKind.NoSubstitutionTemplateLiteral: + return true; + } + return false; +} diff --git a/tests/baselines/reference/computedEnumMemberSyntacticallyString.errors.txt b/tests/baselines/reference/computedEnumMemberSyntacticallyString.errors.txt new file mode 100644 index 0000000000000..493be5043f376 --- /dev/null +++ b/tests/baselines/reference/computedEnumMemberSyntacticallyString.errors.txt @@ -0,0 +1,16 @@ +computedEnumMemberSyntacticallyString.ts(4,9): error TS18033: Type 'string' is not assignable to type 'number' as required for computed enum member values. +computedEnumMemberSyntacticallyString.ts(5,9): error TS18033: Type 'string' is not assignable to type 'number' as required for computed enum member values. + + +==== computedEnumMemberSyntacticallyString.ts (2 errors) ==== + const BAR = 2..toFixed(0); + + enum Foo { + A = `${BAR}`, + ~~~~~~~~ +!!! error TS18033: Type 'string' is not assignable to type 'number' as required for computed enum member values. + B = "2" + BAR, + ~~~~~~~~~ +!!! error TS18033: Type 'string' is not assignable to type 'number' as required for computed enum member values. + } + \ No newline at end of file diff --git a/tests/baselines/reference/computedEnumMemberSyntacticallyString.js b/tests/baselines/reference/computedEnumMemberSyntacticallyString.js new file mode 100644 index 0000000000000..47847d7724ad5 --- /dev/null +++ b/tests/baselines/reference/computedEnumMemberSyntacticallyString.js @@ -0,0 +1,18 @@ +//// [tests/cases/compiler/computedEnumMemberSyntacticallyString.ts] //// + +//// [computedEnumMemberSyntacticallyString.ts] +const BAR = 2..toFixed(0); + +enum Foo { + A = `${BAR}`, + B = "2" + BAR, +} + + +//// [computedEnumMemberSyntacticallyString.js] +const BAR = 2..toFixed(0); +var Foo; +(function (Foo) { + Foo["A"] = `${BAR}`; + Foo["B"] = "2" + BAR; +})(Foo || (Foo = {})); diff --git a/tests/cases/compiler/computedEnumMemberSyntacticallyString.ts b/tests/cases/compiler/computedEnumMemberSyntacticallyString.ts new file mode 100644 index 0000000000000..2c160bc4ac5b3 --- /dev/null +++ b/tests/cases/compiler/computedEnumMemberSyntacticallyString.ts @@ -0,0 +1,9 @@ +// @noTypesAndSymbols: true +// @target: esnext + +const BAR = 2..toFixed(0); + +enum Foo { + A = `${BAR}`, + B = "2" + BAR, +} From 46e5856363f6ab48317ff7f71688170d8f167971 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Thu, 7 Mar 2024 16:55:28 -0800 Subject: [PATCH 2/6] Update tests --- src/testRunner/unittests/services/transpile.ts | 9 +++++++++ ...lyString(isolatedmodules=false).errors.txt} | 0 ...tacticallyString(isolatedmodules=false).js} | 0 ...allyString(isolatedmodules=true).errors.txt | 16 ++++++++++++++++ ...yntacticallyString(isolatedmodules=true).js | 18 ++++++++++++++++++ ...tacticallyString2(isolatedmodules=false).js | 17 +++++++++++++++++ ...ntacticallyString2(isolatedmodules=true).js | 17 +++++++++++++++++ ... enum members do not get reverse mapping.js | 6 ++++++ ... do not get reverse mapping.oldTranspile.js | 6 ++++++ .../computedEnumMemberSyntacticallyString.ts | 1 + .../computedEnumMemberSyntacticallyString2.ts | 10 ++++++++++ 11 files changed, 100 insertions(+) rename tests/baselines/reference/{computedEnumMemberSyntacticallyString.errors.txt => computedEnumMemberSyntacticallyString(isolatedmodules=false).errors.txt} (100%) rename tests/baselines/reference/{computedEnumMemberSyntacticallyString.js => computedEnumMemberSyntacticallyString(isolatedmodules=false).js} (100%) create mode 100644 tests/baselines/reference/computedEnumMemberSyntacticallyString(isolatedmodules=true).errors.txt create mode 100644 tests/baselines/reference/computedEnumMemberSyntacticallyString(isolatedmodules=true).js create mode 100644 tests/baselines/reference/computedEnumMemberSyntacticallyString2(isolatedmodules=false).js create mode 100644 tests/baselines/reference/computedEnumMemberSyntacticallyString2(isolatedmodules=true).js create mode 100644 tests/baselines/reference/transpile/Syntactically string but non-evaulatable enum members do not get reverse mapping.js create mode 100644 tests/baselines/reference/transpile/Syntactically string but non-evaulatable enum members do not get reverse mapping.oldTranspile.js create mode 100644 tests/cases/compiler/computedEnumMemberSyntacticallyString2.ts diff --git a/src/testRunner/unittests/services/transpile.ts b/src/testRunner/unittests/services/transpile.ts index f308c20a1bb0f..99b8ba07ba3b2 100644 --- a/src/testRunner/unittests/services/transpile.ts +++ b/src/testRunner/unittests/services/transpile.ts @@ -673,4 +673,13 @@ export * as alias from './file';`, options: { compilerOptions: { module: ts.ModuleKind.ESNext, target: ts.ScriptTarget.ESNext } }, }, ); + + transpilesCorrectly( + "Syntactically string but non-evaulatable enum members do not get reverse mapping", + // eslint-disable-next-line no-template-curly-in-string + "import { BAR } from './bar'; enum Foo { A = `${BAR}` }", + { + options: { compilerOptions: { target: ts.ScriptTarget.ESNext } }, + }, + ); }); diff --git a/tests/baselines/reference/computedEnumMemberSyntacticallyString.errors.txt b/tests/baselines/reference/computedEnumMemberSyntacticallyString(isolatedmodules=false).errors.txt similarity index 100% rename from tests/baselines/reference/computedEnumMemberSyntacticallyString.errors.txt rename to tests/baselines/reference/computedEnumMemberSyntacticallyString(isolatedmodules=false).errors.txt diff --git a/tests/baselines/reference/computedEnumMemberSyntacticallyString.js b/tests/baselines/reference/computedEnumMemberSyntacticallyString(isolatedmodules=false).js similarity index 100% rename from tests/baselines/reference/computedEnumMemberSyntacticallyString.js rename to tests/baselines/reference/computedEnumMemberSyntacticallyString(isolatedmodules=false).js diff --git a/tests/baselines/reference/computedEnumMemberSyntacticallyString(isolatedmodules=true).errors.txt b/tests/baselines/reference/computedEnumMemberSyntacticallyString(isolatedmodules=true).errors.txt new file mode 100644 index 0000000000000..493be5043f376 --- /dev/null +++ b/tests/baselines/reference/computedEnumMemberSyntacticallyString(isolatedmodules=true).errors.txt @@ -0,0 +1,16 @@ +computedEnumMemberSyntacticallyString.ts(4,9): error TS18033: Type 'string' is not assignable to type 'number' as required for computed enum member values. +computedEnumMemberSyntacticallyString.ts(5,9): error TS18033: Type 'string' is not assignable to type 'number' as required for computed enum member values. + + +==== computedEnumMemberSyntacticallyString.ts (2 errors) ==== + const BAR = 2..toFixed(0); + + enum Foo { + A = `${BAR}`, + ~~~~~~~~ +!!! error TS18033: Type 'string' is not assignable to type 'number' as required for computed enum member values. + B = "2" + BAR, + ~~~~~~~~~ +!!! error TS18033: Type 'string' is not assignable to type 'number' as required for computed enum member values. + } + \ No newline at end of file diff --git a/tests/baselines/reference/computedEnumMemberSyntacticallyString(isolatedmodules=true).js b/tests/baselines/reference/computedEnumMemberSyntacticallyString(isolatedmodules=true).js new file mode 100644 index 0000000000000..47847d7724ad5 --- /dev/null +++ b/tests/baselines/reference/computedEnumMemberSyntacticallyString(isolatedmodules=true).js @@ -0,0 +1,18 @@ +//// [tests/cases/compiler/computedEnumMemberSyntacticallyString.ts] //// + +//// [computedEnumMemberSyntacticallyString.ts] +const BAR = 2..toFixed(0); + +enum Foo { + A = `${BAR}`, + B = "2" + BAR, +} + + +//// [computedEnumMemberSyntacticallyString.js] +const BAR = 2..toFixed(0); +var Foo; +(function (Foo) { + Foo["A"] = `${BAR}`; + Foo["B"] = "2" + BAR; +})(Foo || (Foo = {})); diff --git a/tests/baselines/reference/computedEnumMemberSyntacticallyString2(isolatedmodules=false).js b/tests/baselines/reference/computedEnumMemberSyntacticallyString2(isolatedmodules=false).js new file mode 100644 index 0000000000000..0a0bf9e0a8a24 --- /dev/null +++ b/tests/baselines/reference/computedEnumMemberSyntacticallyString2(isolatedmodules=false).js @@ -0,0 +1,17 @@ +//// [tests/cases/compiler/computedEnumMemberSyntacticallyString2.ts] //// + +//// [foo.ts] +import { BAR } from './bar'; +enum Foo { A = `${BAR}` } + +//// [bar.ts] +export const BAR = 'bar'; + +//// [bar.js] +export const BAR = 'bar'; +//// [foo.js] +import { BAR } from './bar'; +var Foo; +(function (Foo) { + Foo["A"] = "bar"; +})(Foo || (Foo = {})); diff --git a/tests/baselines/reference/computedEnumMemberSyntacticallyString2(isolatedmodules=true).js b/tests/baselines/reference/computedEnumMemberSyntacticallyString2(isolatedmodules=true).js new file mode 100644 index 0000000000000..0a0bf9e0a8a24 --- /dev/null +++ b/tests/baselines/reference/computedEnumMemberSyntacticallyString2(isolatedmodules=true).js @@ -0,0 +1,17 @@ +//// [tests/cases/compiler/computedEnumMemberSyntacticallyString2.ts] //// + +//// [foo.ts] +import { BAR } from './bar'; +enum Foo { A = `${BAR}` } + +//// [bar.ts] +export const BAR = 'bar'; + +//// [bar.js] +export const BAR = 'bar'; +//// [foo.js] +import { BAR } from './bar'; +var Foo; +(function (Foo) { + Foo["A"] = "bar"; +})(Foo || (Foo = {})); diff --git a/tests/baselines/reference/transpile/Syntactically string but non-evaulatable enum members do not get reverse mapping.js b/tests/baselines/reference/transpile/Syntactically string but non-evaulatable enum members do not get reverse mapping.js new file mode 100644 index 0000000000000..32dd7ae8ee2d7 --- /dev/null +++ b/tests/baselines/reference/transpile/Syntactically string but non-evaulatable enum members do not get reverse mapping.js @@ -0,0 +1,6 @@ +import { BAR } from './bar'; +var Foo; +(function (Foo) { + Foo["A"] = `${BAR}`; +})(Foo || (Foo = {})); +//# sourceMappingURL=file.js.map \ No newline at end of file diff --git a/tests/baselines/reference/transpile/Syntactically string but non-evaulatable enum members do not get reverse mapping.oldTranspile.js b/tests/baselines/reference/transpile/Syntactically string but non-evaulatable enum members do not get reverse mapping.oldTranspile.js new file mode 100644 index 0000000000000..32dd7ae8ee2d7 --- /dev/null +++ b/tests/baselines/reference/transpile/Syntactically string but non-evaulatable enum members do not get reverse mapping.oldTranspile.js @@ -0,0 +1,6 @@ +import { BAR } from './bar'; +var Foo; +(function (Foo) { + Foo["A"] = `${BAR}`; +})(Foo || (Foo = {})); +//# sourceMappingURL=file.js.map \ No newline at end of file diff --git a/tests/cases/compiler/computedEnumMemberSyntacticallyString.ts b/tests/cases/compiler/computedEnumMemberSyntacticallyString.ts index 2c160bc4ac5b3..513a1412fcf5a 100644 --- a/tests/cases/compiler/computedEnumMemberSyntacticallyString.ts +++ b/tests/cases/compiler/computedEnumMemberSyntacticallyString.ts @@ -1,3 +1,4 @@ +// @isolatedModules: true,false // @noTypesAndSymbols: true // @target: esnext diff --git a/tests/cases/compiler/computedEnumMemberSyntacticallyString2.ts b/tests/cases/compiler/computedEnumMemberSyntacticallyString2.ts new file mode 100644 index 0000000000000..e163858b13c4a --- /dev/null +++ b/tests/cases/compiler/computedEnumMemberSyntacticallyString2.ts @@ -0,0 +1,10 @@ +// @isolatedModules: true,false +// @noTypesAndSymbols: true +// @target: esnext + +// @filename: ./foo.ts +import { BAR } from './bar'; +enum Foo { A = `${BAR}` } + +// @filename: ./bar.ts +export const BAR = 'bar'; \ No newline at end of file From 604d9a427965c86b35fbd719addbeff9e7429894 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Fri, 8 Mar 2024 09:10:15 -0800 Subject: [PATCH 3/6] Fix typo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jan Kühle --- src/testRunner/unittests/services/transpile.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/testRunner/unittests/services/transpile.ts b/src/testRunner/unittests/services/transpile.ts index 99b8ba07ba3b2..9896c80db1d92 100644 --- a/src/testRunner/unittests/services/transpile.ts +++ b/src/testRunner/unittests/services/transpile.ts @@ -675,7 +675,7 @@ export * as alias from './file';`, ); transpilesCorrectly( - "Syntactically string but non-evaulatable enum members do not get reverse mapping", + "Syntactically string but non-evaluatable enum members do not get reverse mapping", // eslint-disable-next-line no-template-curly-in-string "import { BAR } from './bar'; enum Foo { A = `${BAR}` }", { From e3633bb2758e1f1f1b5eb22148024c37cd77a359 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Fri, 8 Mar 2024 10:38:37 -0800 Subject: [PATCH 4/6] Update baselines --- ...ut non-evaluatable enum members do not get reverse mapping.js} | 0 ...table enum members do not get reverse mapping.oldTranspile.js} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename tests/baselines/reference/transpile/{Syntactically string but non-evaulatable enum members do not get reverse mapping.js => Syntactically string but non-evaluatable enum members do not get reverse mapping.js} (100%) rename tests/baselines/reference/transpile/{Syntactically string but non-evaulatable enum members do not get reverse mapping.oldTranspile.js => Syntactically string but non-evaluatable enum members do not get reverse mapping.oldTranspile.js} (100%) diff --git a/tests/baselines/reference/transpile/Syntactically string but non-evaulatable enum members do not get reverse mapping.js b/tests/baselines/reference/transpile/Syntactically string but non-evaluatable enum members do not get reverse mapping.js similarity index 100% rename from tests/baselines/reference/transpile/Syntactically string but non-evaulatable enum members do not get reverse mapping.js rename to tests/baselines/reference/transpile/Syntactically string but non-evaluatable enum members do not get reverse mapping.js diff --git a/tests/baselines/reference/transpile/Syntactically string but non-evaulatable enum members do not get reverse mapping.oldTranspile.js b/tests/baselines/reference/transpile/Syntactically string but non-evaluatable enum members do not get reverse mapping.oldTranspile.js similarity index 100% rename from tests/baselines/reference/transpile/Syntactically string but non-evaulatable enum members do not get reverse mapping.oldTranspile.js rename to tests/baselines/reference/transpile/Syntactically string but non-evaluatable enum members do not get reverse mapping.oldTranspile.js From 8c0f48a3b5e1e70f3a801b64c9591aaa3c397585 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Tue, 12 Mar 2024 15:54:26 -0700 Subject: [PATCH 5/6] Skip all outer expressions --- src/compiler/utilities.ts | 4 ++-- ...ticallyString(isolatedmodules=false).errors.txt | 14 +++++++++++++- ...erSyntacticallyString(isolatedmodules=false).js | 6 ++++++ ...cticallyString(isolatedmodules=true).errors.txt | 14 +++++++++++++- ...berSyntacticallyString(isolatedmodules=true).js | 6 ++++++ .../computedEnumMemberSyntacticallyString.ts | 3 +++ 6 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index eef53dc6089d1..30ae1377be690 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -319,6 +319,7 @@ import { isNumericLiteral, isObjectLiteralExpression, isOmittedExpression, + isOuterExpression, isParameter, isParameterPropertyDeclaration, isParenthesizedExpression, @@ -10642,6 +10643,7 @@ export function getNameFromImportAttribute(node: ImportAttribute) { /** @internal */ export function isSyntacticallyString(expr: Expression): boolean { + expr = skipOuterExpressions(expr); switch (expr.kind) { case SyntaxKind.BinaryExpression: const left = (expr as BinaryExpression).left; @@ -10650,8 +10652,6 @@ export function isSyntacticallyString(expr: Expression): boolean { (expr as BinaryExpression).operatorToken.kind === SyntaxKind.PlusToken && (isSyntacticallyString(left) || isSyntacticallyString(right)) ); - case SyntaxKind.ParenthesizedExpression: - return isSyntacticallyString((expr as ParenthesizedExpression).expression); case SyntaxKind.TemplateExpression: case SyntaxKind.StringLiteral: case SyntaxKind.NoSubstitutionTemplateLiteral: diff --git a/tests/baselines/reference/computedEnumMemberSyntacticallyString(isolatedmodules=false).errors.txt b/tests/baselines/reference/computedEnumMemberSyntacticallyString(isolatedmodules=false).errors.txt index 493be5043f376..94d81a5a16ac2 100644 --- a/tests/baselines/reference/computedEnumMemberSyntacticallyString(isolatedmodules=false).errors.txt +++ b/tests/baselines/reference/computedEnumMemberSyntacticallyString(isolatedmodules=false).errors.txt @@ -1,8 +1,11 @@ computedEnumMemberSyntacticallyString.ts(4,9): error TS18033: Type 'string' is not assignable to type 'number' as required for computed enum member values. computedEnumMemberSyntacticallyString.ts(5,9): error TS18033: Type 'string' is not assignable to type 'number' as required for computed enum member values. +computedEnumMemberSyntacticallyString.ts(6,9): error TS18033: Type 'string' is not assignable to type 'number' as required for computed enum member values. +computedEnumMemberSyntacticallyString.ts(7,9): error TS18033: Type 'string' is not assignable to type 'number' as required for computed enum member values. +computedEnumMemberSyntacticallyString.ts(8,9): error TS18033: Type 'string' is not assignable to type 'number' as required for computed enum member values. -==== computedEnumMemberSyntacticallyString.ts (2 errors) ==== +==== computedEnumMemberSyntacticallyString.ts (5 errors) ==== const BAR = 2..toFixed(0); enum Foo { @@ -11,6 +14,15 @@ computedEnumMemberSyntacticallyString.ts(5,9): error TS18033: Type 'string' is n !!! error TS18033: Type 'string' is not assignable to type 'number' as required for computed enum member values. B = "2" + BAR, ~~~~~~~~~ +!!! error TS18033: Type 'string' is not assignable to type 'number' as required for computed enum member values. + C = (`${BAR}`), + ~~~~~~~~~~ +!!! error TS18033: Type 'string' is not assignable to type 'number' as required for computed enum member values. + D = (`${BAR}}`) as string, + ~~~~~~~~~~~~~~~~~~~~~ +!!! error TS18033: Type 'string' is not assignable to type 'number' as required for computed enum member values. + E = `${BAR}`!, + ~~~~~~~~~ !!! error TS18033: Type 'string' is not assignable to type 'number' as required for computed enum member values. } \ No newline at end of file diff --git a/tests/baselines/reference/computedEnumMemberSyntacticallyString(isolatedmodules=false).js b/tests/baselines/reference/computedEnumMemberSyntacticallyString(isolatedmodules=false).js index 47847d7724ad5..a8cc14cca3ad4 100644 --- a/tests/baselines/reference/computedEnumMemberSyntacticallyString(isolatedmodules=false).js +++ b/tests/baselines/reference/computedEnumMemberSyntacticallyString(isolatedmodules=false).js @@ -6,6 +6,9 @@ const BAR = 2..toFixed(0); enum Foo { A = `${BAR}`, B = "2" + BAR, + C = (`${BAR}`), + D = (`${BAR}}`) as string, + E = `${BAR}`!, } @@ -15,4 +18,7 @@ var Foo; (function (Foo) { Foo["A"] = `${BAR}`; Foo["B"] = "2" + BAR; + Foo["C"] = (`${BAR}`); + Foo["D"] = (`${BAR}}`); + Foo["E"] = `${BAR}`; })(Foo || (Foo = {})); diff --git a/tests/baselines/reference/computedEnumMemberSyntacticallyString(isolatedmodules=true).errors.txt b/tests/baselines/reference/computedEnumMemberSyntacticallyString(isolatedmodules=true).errors.txt index 493be5043f376..94d81a5a16ac2 100644 --- a/tests/baselines/reference/computedEnumMemberSyntacticallyString(isolatedmodules=true).errors.txt +++ b/tests/baselines/reference/computedEnumMemberSyntacticallyString(isolatedmodules=true).errors.txt @@ -1,8 +1,11 @@ computedEnumMemberSyntacticallyString.ts(4,9): error TS18033: Type 'string' is not assignable to type 'number' as required for computed enum member values. computedEnumMemberSyntacticallyString.ts(5,9): error TS18033: Type 'string' is not assignable to type 'number' as required for computed enum member values. +computedEnumMemberSyntacticallyString.ts(6,9): error TS18033: Type 'string' is not assignable to type 'number' as required for computed enum member values. +computedEnumMemberSyntacticallyString.ts(7,9): error TS18033: Type 'string' is not assignable to type 'number' as required for computed enum member values. +computedEnumMemberSyntacticallyString.ts(8,9): error TS18033: Type 'string' is not assignable to type 'number' as required for computed enum member values. -==== computedEnumMemberSyntacticallyString.ts (2 errors) ==== +==== computedEnumMemberSyntacticallyString.ts (5 errors) ==== const BAR = 2..toFixed(0); enum Foo { @@ -11,6 +14,15 @@ computedEnumMemberSyntacticallyString.ts(5,9): error TS18033: Type 'string' is n !!! error TS18033: Type 'string' is not assignable to type 'number' as required for computed enum member values. B = "2" + BAR, ~~~~~~~~~ +!!! error TS18033: Type 'string' is not assignable to type 'number' as required for computed enum member values. + C = (`${BAR}`), + ~~~~~~~~~~ +!!! error TS18033: Type 'string' is not assignable to type 'number' as required for computed enum member values. + D = (`${BAR}}`) as string, + ~~~~~~~~~~~~~~~~~~~~~ +!!! error TS18033: Type 'string' is not assignable to type 'number' as required for computed enum member values. + E = `${BAR}`!, + ~~~~~~~~~ !!! error TS18033: Type 'string' is not assignable to type 'number' as required for computed enum member values. } \ No newline at end of file diff --git a/tests/baselines/reference/computedEnumMemberSyntacticallyString(isolatedmodules=true).js b/tests/baselines/reference/computedEnumMemberSyntacticallyString(isolatedmodules=true).js index 47847d7724ad5..a8cc14cca3ad4 100644 --- a/tests/baselines/reference/computedEnumMemberSyntacticallyString(isolatedmodules=true).js +++ b/tests/baselines/reference/computedEnumMemberSyntacticallyString(isolatedmodules=true).js @@ -6,6 +6,9 @@ const BAR = 2..toFixed(0); enum Foo { A = `${BAR}`, B = "2" + BAR, + C = (`${BAR}`), + D = (`${BAR}}`) as string, + E = `${BAR}`!, } @@ -15,4 +18,7 @@ var Foo; (function (Foo) { Foo["A"] = `${BAR}`; Foo["B"] = "2" + BAR; + Foo["C"] = (`${BAR}`); + Foo["D"] = (`${BAR}}`); + Foo["E"] = `${BAR}`; })(Foo || (Foo = {})); diff --git a/tests/cases/compiler/computedEnumMemberSyntacticallyString.ts b/tests/cases/compiler/computedEnumMemberSyntacticallyString.ts index 513a1412fcf5a..15af31ebc6fb8 100644 --- a/tests/cases/compiler/computedEnumMemberSyntacticallyString.ts +++ b/tests/cases/compiler/computedEnumMemberSyntacticallyString.ts @@ -7,4 +7,7 @@ const BAR = 2..toFixed(0); enum Foo { A = `${BAR}`, B = "2" + BAR, + C = (`${BAR}`), + D = (`${BAR}}`) as string, + E = `${BAR}`!, } From 086e13e08bf09c8698a0f531041a843471b7cdae Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Wed, 13 Mar 2024 12:34:23 -0700 Subject: [PATCH 6/6] Lint --- src/compiler/utilities.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 30ae1377be690..995cf396a8fb7 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -319,7 +319,6 @@ import { isNumericLiteral, isObjectLiteralExpression, isOmittedExpression, - isOuterExpression, isParameter, isParameterPropertyDeclaration, isParenthesizedExpression,