diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index c0ede7db3a8..88a03f6898b 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -11046,7 +11046,13 @@ namespace ts { function getEffectiveDeclarationFlags(n: Node, flagsToCheck: NodeFlags): NodeFlags { let flags = getCombinedNodeFlags(n); - if (n.parent.kind !== SyntaxKind.InterfaceDeclaration && isInAmbientContext(n)) { + + // children of classes (even ambient classes) should not be marked as ambient or export + // because those flags have no useful semantics there. + if (n.parent.kind !== SyntaxKind.InterfaceDeclaration && + n.parent.kind !== SyntaxKind.ClassDeclaration && + n.parent.kind !== SyntaxKind.ClassExpression && + isInAmbientContext(n)) { if (!(flags & NodeFlags.Ambient)) { // It is nested in an ambient context, which means it is automatically exported flags |= NodeFlags.Export; diff --git a/tests/baselines/reference/ambientClassMergesOverloadsWithInterface.js b/tests/baselines/reference/ambientClassMergesOverloadsWithInterface.js new file mode 100644 index 00000000000..417aedc4abc --- /dev/null +++ b/tests/baselines/reference/ambientClassMergesOverloadsWithInterface.js @@ -0,0 +1,12 @@ +//// [ambientClassMergesOverloadsWithInterface.ts] +declare class C { + baz(): any; + foo(n: number): any; +} +interface C { + foo(n: number): any; + bar(): any; +} + + +//// [ambientClassMergesOverloadsWithInterface.js] diff --git a/tests/baselines/reference/ambientClassMergesOverloadsWithInterface.symbols b/tests/baselines/reference/ambientClassMergesOverloadsWithInterface.symbols new file mode 100644 index 00000000000..9a5eb13d21d --- /dev/null +++ b/tests/baselines/reference/ambientClassMergesOverloadsWithInterface.symbols @@ -0,0 +1,22 @@ +=== tests/cases/compiler/ambientClassMergesOverloadsWithInterface.ts === +declare class C { +>C : Symbol(C, Decl(ambientClassMergesOverloadsWithInterface.ts, 0, 0), Decl(ambientClassMergesOverloadsWithInterface.ts, 3, 1)) + + baz(): any; +>baz : Symbol(baz, Decl(ambientClassMergesOverloadsWithInterface.ts, 0, 17)) + + foo(n: number): any; +>foo : Symbol(foo, Decl(ambientClassMergesOverloadsWithInterface.ts, 1, 15), Decl(ambientClassMergesOverloadsWithInterface.ts, 4, 13)) +>n : Symbol(n, Decl(ambientClassMergesOverloadsWithInterface.ts, 2, 8)) +} +interface C { +>C : Symbol(C, Decl(ambientClassMergesOverloadsWithInterface.ts, 0, 0), Decl(ambientClassMergesOverloadsWithInterface.ts, 3, 1)) + + foo(n: number): any; +>foo : Symbol(foo, Decl(ambientClassMergesOverloadsWithInterface.ts, 1, 15), Decl(ambientClassMergesOverloadsWithInterface.ts, 4, 13)) +>n : Symbol(n, Decl(ambientClassMergesOverloadsWithInterface.ts, 5, 8)) + + bar(): any; +>bar : Symbol(bar, Decl(ambientClassMergesOverloadsWithInterface.ts, 5, 24)) +} + diff --git a/tests/baselines/reference/ambientClassMergesOverloadsWithInterface.types b/tests/baselines/reference/ambientClassMergesOverloadsWithInterface.types new file mode 100644 index 00000000000..7a271b82865 --- /dev/null +++ b/tests/baselines/reference/ambientClassMergesOverloadsWithInterface.types @@ -0,0 +1,22 @@ +=== tests/cases/compiler/ambientClassMergesOverloadsWithInterface.ts === +declare class C { +>C : C + + baz(): any; +>baz : () => any + + foo(n: number): any; +>foo : { (n: number): any; (n: number): any; } +>n : number +} +interface C { +>C : C + + foo(n: number): any; +>foo : { (n: number): any; (n: number): any; } +>n : number + + bar(): any; +>bar : () => any +} + diff --git a/tests/cases/compiler/ambientClassMergesOverloadsWithInterface.ts b/tests/cases/compiler/ambientClassMergesOverloadsWithInterface.ts new file mode 100644 index 00000000000..6a6d3658b63 --- /dev/null +++ b/tests/cases/compiler/ambientClassMergesOverloadsWithInterface.ts @@ -0,0 +1,8 @@ +declare class C { + baz(): any; + foo(n: number): any; +} +interface C { + foo(n: number): any; + bar(): any; +}