Skip to content

Commit ab2a38e

Browse files
Merge pull request #29102 from Microsoft/declarationEmitForDefaultExportClassExtendingExpression
Declaration emit for default exported class extending expression
2 parents fcd5025 + dec3fe6 commit ab2a38e

5 files changed

+158
-1
lines changed

src/compiler/transformers/declarations.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1100,7 +1100,8 @@ namespace ts {
11001100
if (extendsClause && !isEntityNameExpression(extendsClause.expression) && extendsClause.expression.kind !== SyntaxKind.NullKeyword) {
11011101
// We must add a temporary declaration for the extends clause expression
11021102

1103-
const newId = createOptimisticUniqueName(`${unescapeLeadingUnderscores(input.name!.escapedText)}_base`); // TODO: GH#18217
1103+
const oldId = input.name ? unescapeLeadingUnderscores(input.name.escapedText) : "default";
1104+
const newId = createOptimisticUniqueName(`${oldId}_base`);
11041105
getSymbolAccessibilityDiagnostic = () => ({
11051106
diagnosticMessage: Diagnostics.extends_clause_of_exported_class_0_has_or_is_using_private_name_1,
11061107
errorNode: extendsClause,
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
//// [declarationEmitForDefaultExportClassExtendingExpression01.ts]
2+
interface Greeter {
3+
getGreeting(): string;
4+
}
5+
6+
interface GreeterConstructor {
7+
new (): Greeter;
8+
}
9+
10+
class A {
11+
getGreeting() {
12+
return 'hello';
13+
}
14+
}
15+
16+
const getGreeterBase = (): GreeterConstructor => A;
17+
18+
export default class extends getGreeterBase() {
19+
}
20+
21+
22+
23+
//// [declarationEmitForDefaultExportClassExtendingExpression01.js]
24+
"use strict";
25+
var __extends = (this && this.__extends) || (function () {
26+
var extendStatics = function (d, b) {
27+
extendStatics = Object.setPrototypeOf ||
28+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
29+
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
30+
return extendStatics(d, b);
31+
};
32+
return function (d, b) {
33+
extendStatics(d, b);
34+
function __() { this.constructor = d; }
35+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
36+
};
37+
})();
38+
exports.__esModule = true;
39+
var A = /** @class */ (function () {
40+
function A() {
41+
}
42+
A.prototype.getGreeting = function () {
43+
return 'hello';
44+
};
45+
return A;
46+
}());
47+
var getGreeterBase = function () { return A; };
48+
var default_1 = /** @class */ (function (_super) {
49+
__extends(default_1, _super);
50+
function default_1() {
51+
return _super !== null && _super.apply(this, arguments) || this;
52+
}
53+
return default_1;
54+
}(getGreeterBase()));
55+
exports["default"] = default_1;
56+
57+
58+
//// [declarationEmitForDefaultExportClassExtendingExpression01.d.ts]
59+
interface Greeter {
60+
getGreeting(): string;
61+
}
62+
interface GreeterConstructor {
63+
new (): Greeter;
64+
}
65+
declare const default_base: GreeterConstructor;
66+
export default class extends default_base {
67+
}
68+
export {};
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
=== tests/cases/compiler/declarationEmitForDefaultExportClassExtendingExpression01.ts ===
2+
interface Greeter {
3+
>Greeter : Symbol(Greeter, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 0, 0))
4+
5+
getGreeting(): string;
6+
>getGreeting : Symbol(Greeter.getGreeting, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 0, 19))
7+
}
8+
9+
interface GreeterConstructor {
10+
>GreeterConstructor : Symbol(GreeterConstructor, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 2, 1))
11+
12+
new (): Greeter;
13+
>Greeter : Symbol(Greeter, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 0, 0))
14+
}
15+
16+
class A {
17+
>A : Symbol(A, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 6, 1))
18+
19+
getGreeting() {
20+
>getGreeting : Symbol(A.getGreeting, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 8, 9))
21+
22+
return 'hello';
23+
}
24+
}
25+
26+
const getGreeterBase = (): GreeterConstructor => A;
27+
>getGreeterBase : Symbol(getGreeterBase, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 14, 5))
28+
>GreeterConstructor : Symbol(GreeterConstructor, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 2, 1))
29+
>A : Symbol(A, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 6, 1))
30+
31+
export default class extends getGreeterBase() {
32+
>getGreeterBase : Symbol(getGreeterBase, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 14, 5))
33+
}
34+
35+
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
=== tests/cases/compiler/declarationEmitForDefaultExportClassExtendingExpression01.ts ===
2+
interface Greeter {
3+
getGreeting(): string;
4+
>getGreeting : () => string
5+
}
6+
7+
interface GreeterConstructor {
8+
new (): Greeter;
9+
}
10+
11+
class A {
12+
>A : A
13+
14+
getGreeting() {
15+
>getGreeting : () => string
16+
17+
return 'hello';
18+
>'hello' : "hello"
19+
}
20+
}
21+
22+
const getGreeterBase = (): GreeterConstructor => A;
23+
>getGreeterBase : () => GreeterConstructor
24+
>(): GreeterConstructor => A : () => GreeterConstructor
25+
>A : typeof A
26+
27+
export default class extends getGreeterBase() {
28+
>getGreeterBase() : Greeter
29+
>getGreeterBase : () => GreeterConstructor
30+
}
31+
32+
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// @declaration: true
2+
3+
interface Greeter {
4+
getGreeting(): string;
5+
}
6+
7+
interface GreeterConstructor {
8+
new (): Greeter;
9+
}
10+
11+
class A {
12+
getGreeting() {
13+
return 'hello';
14+
}
15+
}
16+
17+
const getGreeterBase = (): GreeterConstructor => A;
18+
19+
export default class extends getGreeterBase() {
20+
}
21+

0 commit comments

Comments
 (0)