Skip to content

Commit 3c130d1

Browse files
authored
feat(37092): improve error message about missing default export (microsoft#37212)
1 parent 7f59949 commit 3c130d1

File tree

4 files changed

+31
-12
lines changed

4 files changed

+31
-12
lines changed

src/compiler/checker.ts

+25-12
Original file line numberDiff line numberDiff line change
@@ -2388,18 +2388,7 @@ namespace ts {
23882388
));
23892389
}
23902390
else {
2391-
if (moduleSymbol.exports && moduleSymbol.exports.has(node.symbol.escapedName)) {
2392-
error(
2393-
node.name,
2394-
Diagnostics.Module_0_has_no_default_export_Did_you_mean_to_use_import_1_from_0_instead,
2395-
symbolToString(moduleSymbol),
2396-
symbolToString(node.symbol),
2397-
);
2398-
}
2399-
else {
2400-
error(node.name, Diagnostics.Module_0_has_no_default_export, symbolToString(moduleSymbol));
2401-
}
2402-
2391+
reportNonDefaultExport(moduleSymbol, node);
24032392
}
24042393
}
24052394
else if (hasSyntheticDefault) {
@@ -2413,6 +2402,30 @@ namespace ts {
24132402
}
24142403
}
24152404

2405+
function reportNonDefaultExport(moduleSymbol: Symbol, node: ImportClause) {
2406+
if (moduleSymbol.exports?.has(node.symbol.escapedName)) {
2407+
error(
2408+
node.name,
2409+
Diagnostics.Module_0_has_no_default_export_Did_you_mean_to_use_import_1_from_0_instead,
2410+
symbolToString(moduleSymbol),
2411+
symbolToString(node.symbol),
2412+
);
2413+
}
2414+
else {
2415+
const diagnostic = error(node.name, Diagnostics.Module_0_has_no_default_export, symbolToString(moduleSymbol));
2416+
const exportStar = moduleSymbol.exports?.get(InternalSymbolName.ExportStar);
2417+
if (exportStar) {
2418+
const defaultExport = find(exportStar.declarations, decl => !!(
2419+
isExportDeclaration(decl) && decl.moduleSpecifier &&
2420+
resolveExternalModuleName(decl, decl.moduleSpecifier)?.exports?.has(InternalSymbolName.Default)
2421+
));
2422+
if (defaultExport) {
2423+
addRelatedInfo(diagnostic, createDiagnosticForNode(defaultExport, Diagnostics.export_Asterisk_does_not_re_export_a_default));
2424+
}
2425+
}
2426+
}
2427+
}
2428+
24162429
function getTargetOfNamespaceImport(node: NamespaceImport, dontResolveAlias: boolean): Symbol | undefined {
24172430
const moduleSpecifier = node.parent.parent.moduleSpecifier;
24182431
const immediate = resolveExternalModuleName(node, moduleSpecifier);

src/compiler/diagnosticMessages.json

+4
Original file line numberDiff line numberDiff line change
@@ -611,6 +611,10 @@
611611
"category": "Error",
612612
"code": 1194
613613
},
614+
"'export *' does not re-export a default.": {
615+
"category": "Error",
616+
"code": 1195
617+
},
614618
"Catch clause variable cannot have a type annotation.": {
615619
"category": "Error",
616620
"code": 1196

tests/baselines/reference/exportStar-amd.errors.txt

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ tests/cases/conformance/es6/modules/t4.ts(3,1): error TS2308: Module "./t1" has
3030
import hello, { x, y, z, foo } from "./t4";
3131
~~~~~
3232
!!! error TS1192: Module '"tests/cases/conformance/es6/modules/t4"' has no default export.
33+
!!! related TS1195 tests/cases/conformance/es6/modules/t4.ts:2:1: 'export *' does not re-export a default.
3334
hello;
3435
x;
3536
y;

tests/baselines/reference/exportStar.errors.txt

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ tests/cases/conformance/es6/modules/t4.ts(3,1): error TS2308: Module "./t1" has
3030
import hello, { x, y, z, foo } from "./t4";
3131
~~~~~
3232
!!! error TS1192: Module '"tests/cases/conformance/es6/modules/t4"' has no default export.
33+
!!! related TS1195 tests/cases/conformance/es6/modules/t4.ts:2:1: 'export *' does not re-export a default.
3334
hello;
3435
x;
3536
y;

0 commit comments

Comments
 (0)