diff --git a/src/diagnosticMessages.json b/src/diagnosticMessages.json index 5c9a03e6f2..c77e0e9519 100644 --- a/src/diagnosticMessages.json +++ b/src/diagnosticMessages.json @@ -114,6 +114,7 @@ "A definite assignment assertion '!' is not permitted in this context.": 1255, "A class may only extend another class.": 1311, "A parameter property cannot be declared using a rest parameter.": 1317, + "A default export can only be used in a module.": 1319, "An identifier or keyword cannot immediately follow a numeric literal.": 1351, "Duplicate identifier '{0}'.": 2300, diff --git a/src/parser.ts b/src/parser.ts index b9dc2fc7b3..08bf51e1dc 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -2483,8 +2483,16 @@ export class Parser extends DiagnosticEmitter { ); while (!tn.skip(Token.CLOSEBRACE)) { let member = this.parseTopLevelStatement(tn, declaration); - if (member) members.push(member); - else { + if (member) { + if (member.kind == NodeKind.EXPORT) { + this.error( + DiagnosticCode.A_default_export_can_only_be_used_in_a_module, + member.range, + ); + return null; + } + members.push(member); + } else { this.skipStatement(tn); if (tn.skip(Token.ENDOFFILE)) { this.error( diff --git a/tests/parser/export-default-in-namespace.ts b/tests/parser/export-default-in-namespace.ts new file mode 100644 index 0000000000..a9f1432bb6 --- /dev/null +++ b/tests/parser/export-default-in-namespace.ts @@ -0,0 +1,3 @@ +namespace Foo { + export default bar; +} diff --git a/tests/parser/export-default-in-namespace.ts.fixture.ts b/tests/parser/export-default-in-namespace.ts.fixture.ts new file mode 100644 index 0000000000..5f0dfe42e8 --- /dev/null +++ b/tests/parser/export-default-in-namespace.ts.fixture.ts @@ -0,0 +1 @@ +// ERROR 1319: "A default export can only be used in a module." in export-default-in-namespace.ts(2,3+18)