Skip to content

Commit 092018b

Browse files
authored
fix issue where duplicate default exports aren't detected (microsoft#46871)
* fix issue where duplicate default exports aren't detected when there's an interface * accept baseline change * add `exportDefaultInterfaceClassAndValue` test * add more tests for multiple default exports * add two interfaces test Co-authored-by: DetachHead <detachhead@users.noreply.github.com>
1 parent fb1066e commit 092018b

File tree

50 files changed

+667
-3
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+667
-3
lines changed

src/compiler/checker.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40449,10 +40449,10 @@ namespace ts {
4044940449
}
4045040450
// ECMA262: 15.2.1.1 It is a Syntax Error if the ExportedNames of ModuleItemList contains any duplicate entries.
4045140451
// (TS Exceptions: namespaces, function overloads, enums, and interfaces)
40452-
if (flags & (SymbolFlags.Namespace | SymbolFlags.Interface | SymbolFlags.Enum)) {
40452+
if (flags & (SymbolFlags.Namespace | SymbolFlags.Enum)) {
4045340453
return;
4045440454
}
40455-
const exportedDeclarationsCount = countWhere(declarations, isNotOverloadAndNotAccessor);
40455+
const exportedDeclarationsCount = countWhere(declarations, and(isNotOverloadAndNotAccessor, not(isInterfaceDeclaration)));
4045640456
if (flags & SymbolFlags.TypeAlias && exportedDeclarationsCount <= 2) {
4045740457
// it is legal to merge type alias with other values
4045840458
// so count should be either 1 (just type alias) or 2 (type alias + merged value)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
tests/cases/compiler/exportDefaultClassAndValue.ts(2,1): error TS2323: Cannot redeclare exported variable 'default'.
2+
tests/cases/compiler/exportDefaultClassAndValue.ts(3,22): error TS2323: Cannot redeclare exported variable 'default'.
3+
4+
5+
==== tests/cases/compiler/exportDefaultClassAndValue.ts (2 errors) ====
6+
const foo = 1
7+
export default foo
8+
~~~~~~~~~~~~~~~~~~
9+
!!! error TS2323: Cannot redeclare exported variable 'default'.
10+
export default class Foo {}
11+
~~~
12+
!!! error TS2323: Cannot redeclare exported variable 'default'.
13+
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
//// [exportDefaultClassAndValue.ts]
2+
const foo = 1
3+
export default foo
4+
export default class Foo {}
5+
6+
7+
//// [exportDefaultClassAndValue.js]
8+
"use strict";
9+
exports.__esModule = true;
10+
var foo = 1;
11+
exports["default"] = foo;
12+
var Foo = /** @class */ (function () {
13+
function Foo() {
14+
}
15+
return Foo;
16+
}());
17+
exports["default"] = Foo;
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
=== tests/cases/compiler/exportDefaultClassAndValue.ts ===
2+
const foo = 1
3+
>foo : Symbol(foo, Decl(exportDefaultClassAndValue.ts, 0, 5))
4+
5+
export default foo
6+
>foo : Symbol(foo, Decl(exportDefaultClassAndValue.ts, 0, 5))
7+
8+
export default class Foo {}
9+
>Foo : Symbol(foo, Decl(exportDefaultClassAndValue.ts, 0, 13), Decl(exportDefaultClassAndValue.ts, 1, 18))
10+
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
=== tests/cases/compiler/exportDefaultClassAndValue.ts ===
2+
const foo = 1
3+
>foo : 1
4+
>1 : 1
5+
6+
export default foo
7+
>foo : 1
8+
9+
export default class Foo {}
10+
>Foo : foo
11+
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//// [exportDefaultInterfaceAndFunctionOverloads.ts]
2+
export default function foo(value: number): number
3+
export default function foo(value: string): string
4+
export default function foo(value: string | number): string | number {
5+
return 1
6+
}
7+
export default interface Foo {}
8+
9+
10+
//// [exportDefaultInterfaceAndFunctionOverloads.js]
11+
"use strict";
12+
exports.__esModule = true;
13+
function foo(value) {
14+
return 1;
15+
}
16+
exports["default"] = foo;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
=== tests/cases/compiler/exportDefaultInterfaceAndFunctionOverloads.ts ===
2+
export default function foo(value: number): number
3+
>foo : Symbol(foo, Decl(exportDefaultInterfaceAndFunctionOverloads.ts, 0, 0), Decl(exportDefaultInterfaceAndFunctionOverloads.ts, 0, 50), Decl(exportDefaultInterfaceAndFunctionOverloads.ts, 1, 50), Decl(exportDefaultInterfaceAndFunctionOverloads.ts, 4, 1))
4+
>value : Symbol(value, Decl(exportDefaultInterfaceAndFunctionOverloads.ts, 0, 28))
5+
6+
export default function foo(value: string): string
7+
>foo : Symbol(foo, Decl(exportDefaultInterfaceAndFunctionOverloads.ts, 0, 0), Decl(exportDefaultInterfaceAndFunctionOverloads.ts, 0, 50), Decl(exportDefaultInterfaceAndFunctionOverloads.ts, 1, 50), Decl(exportDefaultInterfaceAndFunctionOverloads.ts, 4, 1))
8+
>value : Symbol(value, Decl(exportDefaultInterfaceAndFunctionOverloads.ts, 1, 28))
9+
10+
export default function foo(value: string | number): string | number {
11+
>foo : Symbol(foo, Decl(exportDefaultInterfaceAndFunctionOverloads.ts, 0, 0), Decl(exportDefaultInterfaceAndFunctionOverloads.ts, 0, 50), Decl(exportDefaultInterfaceAndFunctionOverloads.ts, 1, 50), Decl(exportDefaultInterfaceAndFunctionOverloads.ts, 4, 1))
12+
>value : Symbol(value, Decl(exportDefaultInterfaceAndFunctionOverloads.ts, 2, 28))
13+
14+
return 1
15+
}
16+
export default interface Foo {}
17+
>Foo : Symbol(foo, Decl(exportDefaultInterfaceAndFunctionOverloads.ts, 0, 0), Decl(exportDefaultInterfaceAndFunctionOverloads.ts, 0, 50), Decl(exportDefaultInterfaceAndFunctionOverloads.ts, 1, 50), Decl(exportDefaultInterfaceAndFunctionOverloads.ts, 4, 1))
18+
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
=== tests/cases/compiler/exportDefaultInterfaceAndFunctionOverloads.ts ===
2+
export default function foo(value: number): number
3+
>foo : { (value: number): number; (value: string): string; }
4+
>value : number
5+
6+
export default function foo(value: string): string
7+
>foo : { (value: number): number; (value: string): string; }
8+
>value : string
9+
10+
export default function foo(value: string | number): string | number {
11+
>foo : { (value: number): number; (value: string): string; }
12+
>value : string | number
13+
14+
return 1
15+
>1 : 1
16+
}
17+
export default interface Foo {}
18+
Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,22 @@
1+
tests/cases/compiler/exportDefaultInterfaceAndTwoFunctions.ts(1,26): error TS2323: Cannot redeclare exported variable 'default'.
2+
tests/cases/compiler/exportDefaultInterfaceAndTwoFunctions.ts(2,1): error TS2323: Cannot redeclare exported variable 'default'.
13
tests/cases/compiler/exportDefaultInterfaceAndTwoFunctions.ts(2,1): error TS2393: Duplicate function implementation.
4+
tests/cases/compiler/exportDefaultInterfaceAndTwoFunctions.ts(3,1): error TS2323: Cannot redeclare exported variable 'default'.
25
tests/cases/compiler/exportDefaultInterfaceAndTwoFunctions.ts(3,1): error TS2393: Duplicate function implementation.
36

47

5-
==== tests/cases/compiler/exportDefaultInterfaceAndTwoFunctions.ts (2 errors) ====
8+
==== tests/cases/compiler/exportDefaultInterfaceAndTwoFunctions.ts (5 errors) ====
69
export default interface A { a: string; }
10+
~
11+
!!! error TS2323: Cannot redeclare exported variable 'default'.
712
export default function() { return 1; }
813
~~~~~~
14+
!!! error TS2323: Cannot redeclare exported variable 'default'.
15+
~~~~~~
916
!!! error TS2393: Duplicate function implementation.
1017
export default function() { return 2; }
1118
~~~~~~
19+
!!! error TS2323: Cannot redeclare exported variable 'default'.
20+
~~~~~~
1221
!!! error TS2393: Duplicate function implementation.
1322

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
tests/cases/compiler/exportDefaultInterfaceClassAndFunctionOverloads.ts(1,25): error TS2528: A module cannot have multiple default exports.
2+
tests/cases/compiler/exportDefaultInterfaceClassAndFunctionOverloads.ts(2,25): error TS2528: A module cannot have multiple default exports.
3+
tests/cases/compiler/exportDefaultInterfaceClassAndFunctionOverloads.ts(3,25): error TS2528: A module cannot have multiple default exports.
4+
tests/cases/compiler/exportDefaultInterfaceClassAndFunctionOverloads.ts(7,16): error TS2528: A module cannot have multiple default exports.
5+
6+
7+
==== tests/cases/compiler/exportDefaultInterfaceClassAndFunctionOverloads.ts (4 errors) ====
8+
export default function foo(value: number): number
9+
~~~
10+
!!! error TS2528: A module cannot have multiple default exports.
11+
!!! related TS2753 tests/cases/compiler/exportDefaultInterfaceClassAndFunctionOverloads.ts:7:16: Another export default is here.
12+
export default function foo(value: string): string
13+
~~~
14+
!!! error TS2528: A module cannot have multiple default exports.
15+
!!! related TS6204 tests/cases/compiler/exportDefaultInterfaceClassAndFunctionOverloads.ts:7:16: and here.
16+
export default function foo(value: string | number): string | number {
17+
~~~
18+
!!! error TS2528: A module cannot have multiple default exports.
19+
!!! related TS6204 tests/cases/compiler/exportDefaultInterfaceClassAndFunctionOverloads.ts:7:16: and here.
20+
return 1
21+
}
22+
declare class Foo {}
23+
export default Foo
24+
~~~
25+
!!! error TS2528: A module cannot have multiple default exports.
26+
!!! related TS2752 tests/cases/compiler/exportDefaultInterfaceClassAndFunctionOverloads.ts:1:25: The first export default is here.
27+
!!! related TS2752 tests/cases/compiler/exportDefaultInterfaceClassAndFunctionOverloads.ts:2:25: The first export default is here.
28+
!!! related TS2752 tests/cases/compiler/exportDefaultInterfaceClassAndFunctionOverloads.ts:3:25: The first export default is here.
29+
export default interface Bar {}
30+

0 commit comments

Comments
 (0)