Merge pull request #29102 from Microsoft/declarationEmitForDefaultExportClassExtendingExpression

Declaration emit for default exported class extending expression
This commit is contained in:
Daniel Rosenwasser 2018-12-19 16:19:36 -08:00 committed by GitHub
commit ab2a38ebef
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 158 additions and 1 deletions

View file

@ -1100,7 +1100,8 @@ namespace ts {
if (extendsClause && !isEntityNameExpression(extendsClause.expression) && extendsClause.expression.kind !== SyntaxKind.NullKeyword) {
// We must add a temporary declaration for the extends clause expression
const newId = createOptimisticUniqueName(`${unescapeLeadingUnderscores(input.name!.escapedText)}_base`); // TODO: GH#18217
const oldId = input.name ? unescapeLeadingUnderscores(input.name.escapedText) : "default";
const newId = createOptimisticUniqueName(`${oldId}_base`);
getSymbolAccessibilityDiagnostic = () => ({
diagnosticMessage: Diagnostics.extends_clause_of_exported_class_0_has_or_is_using_private_name_1,
errorNode: extendsClause,

View file

@ -0,0 +1,68 @@
//// [declarationEmitForDefaultExportClassExtendingExpression01.ts]
interface Greeter {
getGreeting(): string;
}
interface GreeterConstructor {
new (): Greeter;
}
class A {
getGreeting() {
return 'hello';
}
}
const getGreeterBase = (): GreeterConstructor => A;
export default class extends getGreeterBase() {
}
//// [declarationEmitForDefaultExportClassExtendingExpression01.js]
"use strict";
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
exports.__esModule = true;
var A = /** @class */ (function () {
function A() {
}
A.prototype.getGreeting = function () {
return 'hello';
};
return A;
}());
var getGreeterBase = function () { return A; };
var default_1 = /** @class */ (function (_super) {
__extends(default_1, _super);
function default_1() {
return _super !== null && _super.apply(this, arguments) || this;
}
return default_1;
}(getGreeterBase()));
exports["default"] = default_1;
//// [declarationEmitForDefaultExportClassExtendingExpression01.d.ts]
interface Greeter {
getGreeting(): string;
}
interface GreeterConstructor {
new (): Greeter;
}
declare const default_base: GreeterConstructor;
export default class extends default_base {
}
export {};

View file

@ -0,0 +1,35 @@
=== tests/cases/compiler/declarationEmitForDefaultExportClassExtendingExpression01.ts ===
interface Greeter {
>Greeter : Symbol(Greeter, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 0, 0))
getGreeting(): string;
>getGreeting : Symbol(Greeter.getGreeting, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 0, 19))
}
interface GreeterConstructor {
>GreeterConstructor : Symbol(GreeterConstructor, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 2, 1))
new (): Greeter;
>Greeter : Symbol(Greeter, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 0, 0))
}
class A {
>A : Symbol(A, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 6, 1))
getGreeting() {
>getGreeting : Symbol(A.getGreeting, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 8, 9))
return 'hello';
}
}
const getGreeterBase = (): GreeterConstructor => A;
>getGreeterBase : Symbol(getGreeterBase, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 14, 5))
>GreeterConstructor : Symbol(GreeterConstructor, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 2, 1))
>A : Symbol(A, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 6, 1))
export default class extends getGreeterBase() {
>getGreeterBase : Symbol(getGreeterBase, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 14, 5))
}

View file

@ -0,0 +1,32 @@
=== tests/cases/compiler/declarationEmitForDefaultExportClassExtendingExpression01.ts ===
interface Greeter {
getGreeting(): string;
>getGreeting : () => string
}
interface GreeterConstructor {
new (): Greeter;
}
class A {
>A : A
getGreeting() {
>getGreeting : () => string
return 'hello';
>'hello' : "hello"
}
}
const getGreeterBase = (): GreeterConstructor => A;
>getGreeterBase : () => GreeterConstructor
>(): GreeterConstructor => A : () => GreeterConstructor
>A : typeof A
export default class extends getGreeterBase() {
>getGreeterBase() : Greeter
>getGreeterBase : () => GreeterConstructor
}

View file

@ -0,0 +1,21 @@
// @declaration: true
interface Greeter {
getGreeting(): string;
}
interface GreeterConstructor {
new (): Greeter;
}
class A {
getGreeting() {
return 'hello';
}
}
const getGreeterBase = (): GreeterConstructor => A;
export default class extends getGreeterBase() {
}