Merge pull request #13913 from Microsoft/allowExportDeclarationsInAmbientNamespaces

Allow export declarations in ambient namespaces
This commit is contained in:
Mohamed Hegazy 2017-02-14 11:44:07 -08:00 committed by GitHub
commit 13cb66c555
8 changed files with 108 additions and 1 deletions

View file

@ -19540,7 +19540,9 @@ namespace ts {
forEach(node.exportClause.elements, checkExportSpecifier);
const inAmbientExternalModule = node.parent.kind === SyntaxKind.ModuleBlock && isAmbientModule(node.parent.parent);
if (node.parent.kind !== SyntaxKind.SourceFile && !inAmbientExternalModule) {
const inAmbientNamespaceDeclaration = !inAmbientExternalModule && node.parent.kind === SyntaxKind.ModuleBlock &&
!node.moduleSpecifier && isInAmbientContext(node);
if (node.parent.kind !== SyntaxKind.SourceFile && !inAmbientExternalModule && !inAmbientNamespaceDeclaration) {
error(node, Diagnostics.Export_declarations_are_not_permitted_in_a_namespace);
}
}

View file

@ -0,0 +1,13 @@
//// [exportDeclarationsInAmbientNamespaces.ts]
declare namespace Q {
function _try(method: Function, ...args: any[]): any;
export { _try as try };
}
Q.try(() => { });
//// [exportDeclarationsInAmbientNamespaces.js]
Q["try"](function () { });

View file

@ -0,0 +1,22 @@
=== tests/cases/compiler/exportDeclarationsInAmbientNamespaces.ts ===
declare namespace Q {
>Q : Symbol(Q, Decl(exportDeclarationsInAmbientNamespaces.ts, 0, 0))
function _try(method: Function, ...args: any[]): any;
>_try : Symbol(_try, Decl(exportDeclarationsInAmbientNamespaces.ts, 1, 21))
>method : Symbol(method, Decl(exportDeclarationsInAmbientNamespaces.ts, 2, 18))
>Function : Symbol(Function, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
>args : Symbol(args, Decl(exportDeclarationsInAmbientNamespaces.ts, 2, 35))
export { _try as try };
>_try : Symbol(try, Decl(exportDeclarationsInAmbientNamespaces.ts, 3, 12))
>try : Symbol(try, Decl(exportDeclarationsInAmbientNamespaces.ts, 3, 12))
}
Q.try(() => { });
>Q.try : Symbol(Q.try, Decl(exportDeclarationsInAmbientNamespaces.ts, 3, 12))
>Q : Symbol(Q, Decl(exportDeclarationsInAmbientNamespaces.ts, 0, 0))
>try : Symbol(Q.try, Decl(exportDeclarationsInAmbientNamespaces.ts, 3, 12))

View file

@ -0,0 +1,24 @@
=== tests/cases/compiler/exportDeclarationsInAmbientNamespaces.ts ===
declare namespace Q {
>Q : typeof Q
function _try(method: Function, ...args: any[]): any;
>_try : (method: Function, ...args: any[]) => any
>method : Function
>Function : Function
>args : any[]
export { _try as try };
>_try : (method: Function, ...args: any[]) => any
>try : (method: Function, ...args: any[]) => any
}
Q.try(() => { });
>Q.try(() => { }) : any
>Q.try : (method: Function, ...args: any[]) => any
>Q : typeof Q
>try : (method: Function, ...args: any[]) => any
>() => { } : () => void

View file

@ -0,0 +1,16 @@
tests/cases/compiler/exportDeclarationsInAmbientNamespaces2.ts(7,23): error TS1194: Export declarations are not permitted in a namespace.
==== tests/cases/compiler/exportDeclarationsInAmbientNamespaces2.ts (1 errors) ====
declare module "mod" {
export var x: number;
}
declare namespace N {
export { x } from "mod"; // Error
~~~~~
!!! error TS1194: Export declarations are not permitted in a namespace.
}

View file

@ -0,0 +1,13 @@
//// [exportDeclarationsInAmbientNamespaces2.ts]
declare module "mod" {
export var x: number;
}
declare namespace N {
export { x } from "mod"; // Error
}
//// [exportDeclarationsInAmbientNamespaces2.js]

View file

@ -0,0 +1,8 @@
declare namespace Q {
function _try(method: Function, ...args: any[]): any;
export { _try as try };
}
Q.try(() => { });

View file

@ -0,0 +1,9 @@
declare module "mod" {
export var x: number;
}
declare namespace N {
export { x } from "mod"; // Error
}