From 13169870b49569025db0ffbde2174f7bfdcbc449 Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Wed, 24 May 2023 22:14:19 +0300 Subject: [PATCH] fix(54152): Cannot use const enum to define an interface key in isolatedModules mode (#54165) --- src/compiler/checker.ts | 2 +- .../reference/isolatedModulesConstEnum.js | 21 ++++++++ .../isolatedModulesConstEnum.symbols | 46 ++++++++++++++++++ .../reference/isolatedModulesConstEnum.types | 48 +++++++++++++++++++ .../compiler/isolatedModulesConstEnum.ts | 17 +++++++ 5 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/isolatedModulesConstEnum.js create mode 100644 tests/baselines/reference/isolatedModulesConstEnum.symbols create mode 100644 tests/baselines/reference/isolatedModulesConstEnum.types create mode 100644 tests/cases/compiler/isolatedModulesConstEnum.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 9458a6cfaf8..0a38e6cda5f 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -37825,7 +37825,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (getIsolatedModules(compilerOptions)) { Debug.assert(!!(type.symbol.flags & SymbolFlags.ConstEnum)); const constEnumDeclaration = type.symbol.valueDeclaration as EnumDeclaration; - if (constEnumDeclaration.flags & NodeFlags.Ambient) { + if (constEnumDeclaration.flags & NodeFlags.Ambient && !isValidTypeOnlyAliasUseSite(node)) { error(node, Diagnostics.Cannot_access_ambient_const_enums_when_0_is_enabled, isolatedModulesLikeFlagName); } } diff --git a/tests/baselines/reference/isolatedModulesConstEnum.js b/tests/baselines/reference/isolatedModulesConstEnum.js new file mode 100644 index 00000000000..10486d2d3a1 --- /dev/null +++ b/tests/baselines/reference/isolatedModulesConstEnum.js @@ -0,0 +1,21 @@ +//// [tests/cases/compiler/isolatedModulesConstEnum.ts] //// + +//// [foo.d.ts] +declare const enum EventName { + FOO = 1, + BAR = 2 +} + +type E1 = { + [EventName.FOO]: number; + [EventName.BAR]: string; +}; + +//// [bar.ts] +type E2 = { + [EventName.FOO]: number; + [EventName.BAR]: string; +}; + + +//// [bar.js] diff --git a/tests/baselines/reference/isolatedModulesConstEnum.symbols b/tests/baselines/reference/isolatedModulesConstEnum.symbols new file mode 100644 index 00000000000..0f4d3d96529 --- /dev/null +++ b/tests/baselines/reference/isolatedModulesConstEnum.symbols @@ -0,0 +1,46 @@ +=== /foo.d.ts === +declare const enum EventName { +>EventName : Symbol(EventName, Decl(foo.d.ts, 0, 0)) + + FOO = 1, +>FOO : Symbol(EventName.FOO, Decl(foo.d.ts, 0, 30)) + + BAR = 2 +>BAR : Symbol(EventName.BAR, Decl(foo.d.ts, 1, 12)) +} + +type E1 = { +>E1 : Symbol(E1, Decl(foo.d.ts, 3, 1)) + + [EventName.FOO]: number; +>[EventName.FOO] : Symbol([EventName.FOO], Decl(foo.d.ts, 5, 11)) +>EventName.FOO : Symbol(EventName.FOO, Decl(foo.d.ts, 0, 30)) +>EventName : Symbol(EventName, Decl(foo.d.ts, 0, 0)) +>FOO : Symbol(EventName.FOO, Decl(foo.d.ts, 0, 30)) + + [EventName.BAR]: string; +>[EventName.BAR] : Symbol([EventName.BAR], Decl(foo.d.ts, 6, 28)) +>EventName.BAR : Symbol(EventName.BAR, Decl(foo.d.ts, 1, 12)) +>EventName : Symbol(EventName, Decl(foo.d.ts, 0, 0)) +>BAR : Symbol(EventName.BAR, Decl(foo.d.ts, 1, 12)) + +}; + +=== /bar.ts === +type E2 = { +>E2 : Symbol(E2, Decl(bar.ts, 0, 0)) + + [EventName.FOO]: number; +>[EventName.FOO] : Symbol([EventName.FOO], Decl(bar.ts, 0, 11)) +>EventName.FOO : Symbol(EventName.FOO, Decl(foo.d.ts, 0, 30)) +>EventName : Symbol(EventName, Decl(foo.d.ts, 0, 0)) +>FOO : Symbol(EventName.FOO, Decl(foo.d.ts, 0, 30)) + + [EventName.BAR]: string; +>[EventName.BAR] : Symbol([EventName.BAR], Decl(bar.ts, 1, 28)) +>EventName.BAR : Symbol(EventName.BAR, Decl(foo.d.ts, 1, 12)) +>EventName : Symbol(EventName, Decl(foo.d.ts, 0, 0)) +>BAR : Symbol(EventName.BAR, Decl(foo.d.ts, 1, 12)) + +}; + diff --git a/tests/baselines/reference/isolatedModulesConstEnum.types b/tests/baselines/reference/isolatedModulesConstEnum.types new file mode 100644 index 00000000000..67639d9749c --- /dev/null +++ b/tests/baselines/reference/isolatedModulesConstEnum.types @@ -0,0 +1,48 @@ +=== /foo.d.ts === +declare const enum EventName { +>EventName : EventName + + FOO = 1, +>FOO : EventName.FOO +>1 : 1 + + BAR = 2 +>BAR : EventName.BAR +>2 : 2 +} + +type E1 = { +>E1 : { 1: number; 2: string; } + + [EventName.FOO]: number; +>[EventName.FOO] : number +>EventName.FOO : EventName.FOO +>EventName : typeof EventName +>FOO : EventName.FOO + + [EventName.BAR]: string; +>[EventName.BAR] : string +>EventName.BAR : EventName.BAR +>EventName : typeof EventName +>BAR : EventName.BAR + +}; + +=== /bar.ts === +type E2 = { +>E2 : { 1: number; 2: string; } + + [EventName.FOO]: number; +>[EventName.FOO] : number +>EventName.FOO : EventName.FOO +>EventName : typeof EventName +>FOO : EventName.FOO + + [EventName.BAR]: string; +>[EventName.BAR] : string +>EventName.BAR : EventName.BAR +>EventName : typeof EventName +>BAR : EventName.BAR + +}; + diff --git a/tests/cases/compiler/isolatedModulesConstEnum.ts b/tests/cases/compiler/isolatedModulesConstEnum.ts new file mode 100644 index 00000000000..87da3ca19f1 --- /dev/null +++ b/tests/cases/compiler/isolatedModulesConstEnum.ts @@ -0,0 +1,17 @@ +// @isolatedModules: true +// @filename: /foo.d.ts +declare const enum EventName { + FOO = 1, + BAR = 2 +} + +type E1 = { + [EventName.FOO]: number; + [EventName.BAR]: string; +}; + +// @filename: /bar.ts +type E2 = { + [EventName.FOO]: number; + [EventName.BAR]: string; +};