diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 7eae34f95a..a5b9299d1c 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -21319,7 +21319,7 @@ namespace ts { n.parent.kind !== SyntaxKind.ClassDeclaration && n.parent.kind !== SyntaxKind.ClassExpression && n.flags & NodeFlags.Ambient) { - if (!(flags & ModifierFlags.Ambient)) { + if (!(flags & ModifierFlags.Ambient) && !(isModuleBlock(n.parent) && isModuleDeclaration(n.parent.parent) && isGlobalScopeAugmentation(n.parent.parent))) { // It is nested in an ambient context, which means it is automatically exported flags |= ModifierFlags.Export; } diff --git a/tests/baselines/reference/globalFunctionAugmentationOverload.js b/tests/baselines/reference/globalFunctionAugmentationOverload.js new file mode 100644 index 0000000000..50593cca1d --- /dev/null +++ b/tests/baselines/reference/globalFunctionAugmentationOverload.js @@ -0,0 +1,19 @@ +//// [tests/cases/compiler/globalFunctionAugmentationOverload.ts] //// + +//// [mod.d.ts] +declare function expect(spy: Function): void; +declare module "mod" { + class mod {} + export = mod; +} +//// [mine.ts] +import "mod"; + +declare global { + function expect(element: string): void; +} + +//// [mine.js] +"use strict"; +exports.__esModule = true; +require("mod"); diff --git a/tests/baselines/reference/globalFunctionAugmentationOverload.symbols b/tests/baselines/reference/globalFunctionAugmentationOverload.symbols new file mode 100644 index 0000000000..dc37397312 --- /dev/null +++ b/tests/baselines/reference/globalFunctionAugmentationOverload.symbols @@ -0,0 +1,25 @@ +=== tests/cases/compiler/mod.d.ts === +declare function expect(spy: Function): void; +>expect : Symbol(expect, Decl(mod.d.ts, 0, 0), Decl(mine.ts, 2, 16)) +>spy : Symbol(spy, Decl(mod.d.ts, 0, 24)) +>Function : Symbol(Function, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --)) + +declare module "mod" { +>"mod" : Symbol("mod", Decl(mod.d.ts, 0, 45)) + + class mod {} +>mod : Symbol(mod, Decl(mod.d.ts, 1, 22)) + + export = mod; +>mod : Symbol(mod, Decl(mod.d.ts, 1, 22)) +} +=== tests/cases/compiler/mine.ts === +import "mod"; + +declare global { +>global : Symbol(global, Decl(mine.ts, 0, 13)) + + function expect(element: string): void; +>expect : Symbol(expect, Decl(mod.d.ts, 0, 0), Decl(mine.ts, 2, 16)) +>element : Symbol(element, Decl(mine.ts, 3, 20)) +} diff --git a/tests/baselines/reference/globalFunctionAugmentationOverload.types b/tests/baselines/reference/globalFunctionAugmentationOverload.types new file mode 100644 index 0000000000..03e973af8c --- /dev/null +++ b/tests/baselines/reference/globalFunctionAugmentationOverload.types @@ -0,0 +1,25 @@ +=== tests/cases/compiler/mod.d.ts === +declare function expect(spy: Function): void; +>expect : { (spy: Function): void; (element: string): void; } +>spy : Function +>Function : Function + +declare module "mod" { +>"mod" : typeof import("mod") + + class mod {} +>mod : mod + + export = mod; +>mod : mod +} +=== tests/cases/compiler/mine.ts === +import "mod"; + +declare global { +>global : typeof global + + function expect(element: string): void; +>expect : { (spy: Function): void; (element: string): void; } +>element : string +} diff --git a/tests/cases/compiler/globalFunctionAugmentationOverload.ts b/tests/cases/compiler/globalFunctionAugmentationOverload.ts new file mode 100644 index 0000000000..7f46d26213 --- /dev/null +++ b/tests/cases/compiler/globalFunctionAugmentationOverload.ts @@ -0,0 +1,12 @@ +// @filename: mod.d.ts +declare function expect(spy: Function): void; +declare module "mod" { + class mod {} + export = mod; +} +// @filename: mine.ts +import "mod"; + +declare global { + function expect(element: string): void; +} \ No newline at end of file