fix(54152): Cannot use const enum to define an interface key in isolatedModules mode (#54165)

This commit is contained in:
Oleksandr T
2023-05-24 22:14:19 +03:00
committed by GitHub
parent 4c82d918bc
commit 13169870b4
5 changed files with 133 additions and 1 deletions

View File

@@ -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);
}
}

View File

@@ -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]

View File

@@ -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))
};

View File

@@ -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
};

View File

@@ -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;
};