diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index ffa7a69fbd8..e4090f7d8c3 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -870,7 +870,11 @@ namespace ts { (source.flags | target.flags) & SymbolFlags.Assignment) { Debug.assert(source !== target); if (!(target.flags & SymbolFlags.Transient)) { - target = cloneSymbol(resolveSymbol(target)); + const resolvedTarget = resolveSymbol(target); + if (resolvedTarget === unknownSymbol) { + return source; + } + target = cloneSymbol(resolvedTarget); } // Javascript static-property-assignment declarations always merge, even though they are also values if (source.flags & SymbolFlags.ValueModule && target.flags & SymbolFlags.ValueModule && target.constEnumOnlyModule && !source.constEnumOnlyModule) { diff --git a/tests/baselines/reference/exportAsNamespaceConflict.errors.txt b/tests/baselines/reference/exportAsNamespaceConflict.errors.txt new file mode 100644 index 00000000000..02d7f859a69 --- /dev/null +++ b/tests/baselines/reference/exportAsNamespaceConflict.errors.txt @@ -0,0 +1,13 @@ +/a.d.ts(2,10): error TS2708: Cannot use namespace 'N' as a value. +/a.d.ts(3,1): error TS2303: Circular definition of import alias 'N'. + + +==== /a.d.ts (2 errors) ==== + declare global { namespace N {} } + export = N; + ~ +!!! error TS2708: Cannot use namespace 'N' as a value. + export as namespace N; + ~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2303: Circular definition of import alias 'N'. + \ No newline at end of file diff --git a/tests/baselines/reference/exportAsNamespaceConflict.symbols b/tests/baselines/reference/exportAsNamespaceConflict.symbols new file mode 100644 index 00000000000..795d2ca869a --- /dev/null +++ b/tests/baselines/reference/exportAsNamespaceConflict.symbols @@ -0,0 +1,11 @@ +=== /a.d.ts === +declare global { namespace N {} } +>global : Symbol(global, Decl(a.d.ts, 0, 0)) +>N : Symbol(N, Decl(a.d.ts, 0, 16)) + +export = N; +>N : Symbol(N, Decl(a.d.ts, 0, 16)) + +export as namespace N; +>N : Symbol(N, Decl(a.d.ts, 1, 11)) + diff --git a/tests/baselines/reference/exportAsNamespaceConflict.types b/tests/baselines/reference/exportAsNamespaceConflict.types new file mode 100644 index 00000000000..cac9b95d22f --- /dev/null +++ b/tests/baselines/reference/exportAsNamespaceConflict.types @@ -0,0 +1,10 @@ +=== /a.d.ts === +declare global { namespace N {} } +>global : any + +export = N; +>N : any + +export as namespace N; +>N : any + diff --git a/tests/cases/compiler/exportAsNamespaceConflict.ts b/tests/cases/compiler/exportAsNamespaceConflict.ts new file mode 100644 index 00000000000..a30330bc205 --- /dev/null +++ b/tests/cases/compiler/exportAsNamespaceConflict.ts @@ -0,0 +1,4 @@ +// @Filename: /a.d.ts +declare global { namespace N {} } +export = N; +export as namespace N;