From b6d509062e58379907d79b80c9c248e239471c56 Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Fri, 9 Jun 2017 08:13:59 -0700 Subject: [PATCH 1/2] --isolatedModules: Still allow re-export of type in a declaration file --- src/compiler/checker.ts | 8 +++++++- .../reference/isolatedModulesReExportType.errors.txt | 10 ++++++++++ .../reference/isolatedModulesReExportType.js | 12 +++++++++++- tests/cases/compiler/isolatedModulesReExportType.ts | 10 ++++++++++ 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index f66e48c0c81ab..c4263060fcb10 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -21785,7 +21785,13 @@ namespace ts { } // Don't allow to re-export something with no value side when `--isolatedModules` is set. - if (node.kind === SyntaxKind.ExportSpecifier && compilerOptions.isolatedModules && !(target.flags & SymbolFlags.Value)) { + if (compilerOptions.isolatedModules + && node.kind === SyntaxKind.ExportSpecifier + && !(target.flags & SymbolFlags.Value) + // Module augmentation / ambient declaration not allowed under `--isolatedModules` anyway, so this should be at the top-level. + && isSourceFile(node.parent.parent.parent) + // OK to re-export a type in a declaration file. + && !node.parent.parent.parent.isDeclarationFile) { error(node, Diagnostics.Cannot_re_export_a_type_when_the_isolatedModules_flag_is_provided); } } diff --git a/tests/baselines/reference/isolatedModulesReExportType.errors.txt b/tests/baselines/reference/isolatedModulesReExportType.errors.txt index 10c07cde084e3..dc035a84c2fc9 100644 --- a/tests/baselines/reference/isolatedModulesReExportType.errors.txt +++ b/tests/baselines/reference/isolatedModulesReExportType.errors.txt @@ -35,4 +35,14 @@ declare type T = number; export = T; +==== /node_modules/foo/bar.d.ts (0 errors) ==== + export type T = number; + +==== /node_modules/foo/index.d.ts (0 errors) ==== + export { T } from "./bar"; // In a declaration file, so not an error. + +==== /node_modules/baz/index.d.ts (0 errors) ==== + declare module "baz" { + export { T } from "foo"; // Also allowed. + } \ No newline at end of file diff --git a/tests/baselines/reference/isolatedModulesReExportType.js b/tests/baselines/reference/isolatedModulesReExportType.js index 545e5a81a8a88..5924dd249e72a 100644 --- a/tests/baselines/reference/isolatedModulesReExportType.js +++ b/tests/baselines/reference/isolatedModulesReExportType.js @@ -9,7 +9,17 @@ export class C {} //// [exportEqualsT.ts] declare type T = number; export = T; - + +//// [bar.d.ts] +export type T = number; + +//// [index.d.ts] +export { T } from "./bar"; // In a declaration file, so not an error. + +//// [index.d.ts] +declare module "baz" { + export { T } from "foo"; // Also allowed. +} //// [user.ts] // Error, can't re-export something that's only a type. diff --git a/tests/cases/compiler/isolatedModulesReExportType.ts b/tests/cases/compiler/isolatedModulesReExportType.ts index d1e05af6c8320..6d82fd3f180d1 100644 --- a/tests/cases/compiler/isolatedModulesReExportType.ts +++ b/tests/cases/compiler/isolatedModulesReExportType.ts @@ -10,6 +10,16 @@ export class C {} declare type T = number; export = T; +// @Filename: /node_modules/foo/bar.d.ts +export type T = number; + +// @Filename: /node_modules/foo/index.d.ts +export { T } from "./bar"; // In a declaration file, so not an error. + +// @Filename: /node_modules/baz/index.d.ts +declare module "baz" { + export { T } from "foo"; // Also allowed. +} // @Filename: /user.ts // Error, can't re-export something that's only a type. From 060fc65cbcbc4dde822b14702d58dd53223073d1 Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Fri, 9 Jun 2017 09:13:09 -0700 Subject: [PATCH 2/2] Use isInAmbientContext --- src/compiler/checker.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index c4263060fcb10..17c1cd5874155 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -21788,10 +21788,7 @@ namespace ts { if (compilerOptions.isolatedModules && node.kind === SyntaxKind.ExportSpecifier && !(target.flags & SymbolFlags.Value) - // Module augmentation / ambient declaration not allowed under `--isolatedModules` anyway, so this should be at the top-level. - && isSourceFile(node.parent.parent.parent) - // OK to re-export a type in a declaration file. - && !node.parent.parent.parent.isDeclarationFile) { + && !isInAmbientContext(node)) { error(node, Diagnostics.Cannot_re_export_a_type_when_the_isolatedModules_flag_is_provided); } }