diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts
index a27e8ba524d..2a34b4de08a 100644
--- a/src/compiler/checker.ts
+++ b/src/compiler/checker.ts
@@ -1,4 +1,4 @@
-///
{ new (): Component
; }
+ class Component {}
+}
+declare function createComponentClass (factory: () => React.ComponentClass ): React.ComponentClass ;
+class Foo extends createComponentClass(() => class extends React.Component<{}, {}> {
+ render() {
+ return Hello, world!;
+ }
+}) {}
+
+//// [jsxInExtendsClause.js]
+var __extends = (this && this.__extends) || function (d, b) {
+ for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+};
+var Foo = (function (_super) {
+ __extends(Foo, _super);
+ function Foo() {
+ return _super.apply(this, arguments) || this;
+ }
+ return Foo;
+}(createComponentClass(function () { return (function (_super) {
+ __extends(class_1, _super);
+ function class_1() {
+ return _super.apply(this, arguments) || this;
+ }
+ class_1.prototype.render = function () {
+ return React.createElement("span", null, "Hello, world!");
+ };
+ return class_1;
+}(React.Component)); })));
diff --git a/tests/baselines/reference/jsxInExtendsClause.symbols b/tests/baselines/reference/jsxInExtendsClause.symbols
new file mode 100644
index 00000000000..b7f3635bfd9
--- /dev/null
+++ b/tests/baselines/reference/jsxInExtendsClause.symbols
@@ -0,0 +1,42 @@
+=== tests/cases/compiler/jsxInExtendsClause.tsx ===
+// https://github.com/Microsoft/TypeScript/issues/13157
+declare namespace React {
+>React : Symbol(React, Decl(jsxInExtendsClause.tsx, 0, 0))
+
+ interface ComponentClass { new (): Component ; }
+>ComponentClass : Symbol(ComponentClass, Decl(jsxInExtendsClause.tsx, 1, 25))
+>P : Symbol(P, Decl(jsxInExtendsClause.tsx, 2, 27))
+>Component : Symbol(Component, Decl(jsxInExtendsClause.tsx, 2, 59))
+>P : Symbol(P, Decl(jsxInExtendsClause.tsx, 2, 27))
+
+ class Component {}
+>Component : Symbol(Component, Decl(jsxInExtendsClause.tsx, 2, 59))
+>A : Symbol(A, Decl(jsxInExtendsClause.tsx, 3, 18))
+>B : Symbol(B, Decl(jsxInExtendsClause.tsx, 3, 20))
+}
+declare function createComponentClass (factory: () => React.ComponentClass ): React.ComponentClass ;
+>createComponentClass : Symbol(createComponentClass, Decl(jsxInExtendsClause.tsx, 4, 1))
+>P : Symbol(P, Decl(jsxInExtendsClause.tsx, 5, 38))
+>factory : Symbol(factory, Decl(jsxInExtendsClause.tsx, 5, 41))
+>React : Symbol(React, Decl(jsxInExtendsClause.tsx, 0, 0))
+>ComponentClass : Symbol(React.ComponentClass, Decl(jsxInExtendsClause.tsx, 1, 25))
+>P : Symbol(P, Decl(jsxInExtendsClause.tsx, 5, 38))
+>React : Symbol(React, Decl(jsxInExtendsClause.tsx, 0, 0))
+>ComponentClass : Symbol(React.ComponentClass, Decl(jsxInExtendsClause.tsx, 1, 25))
+>P : Symbol(P, Decl(jsxInExtendsClause.tsx, 5, 38))
+
+class Foo extends createComponentClass(() => class extends React.Component<{}, {}> {
+>Foo : Symbol(Foo, Decl(jsxInExtendsClause.tsx, 5, 106))
+>createComponentClass : Symbol(createComponentClass, Decl(jsxInExtendsClause.tsx, 4, 1))
+>React.Component : Symbol(React.Component, Decl(jsxInExtendsClause.tsx, 2, 59))
+>React : Symbol(React, Decl(jsxInExtendsClause.tsx, 0, 0))
+>Component : Symbol(React.Component, Decl(jsxInExtendsClause.tsx, 2, 59))
+
+ render() {
+>render : Symbol((Anonymous class).render, Decl(jsxInExtendsClause.tsx, 6, 84))
+
+ return Hello, world!;
+>span : Symbol(unknown)
+>span : Symbol(unknown)
+ }
+}) {}
diff --git a/tests/baselines/reference/jsxInExtendsClause.types b/tests/baselines/reference/jsxInExtendsClause.types
new file mode 100644
index 00000000000..5363c16a944
--- /dev/null
+++ b/tests/baselines/reference/jsxInExtendsClause.types
@@ -0,0 +1,46 @@
+=== tests/cases/compiler/jsxInExtendsClause.tsx ===
+// https://github.com/Microsoft/TypeScript/issues/13157
+declare namespace React {
+>React : typeof React
+
+ interface ComponentClass { new (): Component ; }
+>ComponentClass : ComponentClass
+>P : P
+>Component : Component
+>P : P
+
+ class Component {}
+>Component : Component
+>A : A
+>B : B
+}
+declare function createComponentClass (factory: () => React.ComponentClass ): React.ComponentClass ;
+>createComponentClass : (factory: () => React.ComponentClass ) => React.ComponentClass
+>P : P
+>factory : () => React.ComponentClass
+>React : any
+>ComponentClass : React.ComponentClass
+>P : P
+>React : any
+>ComponentClass : React.ComponentClass
+>P : P
+
+class Foo extends createComponentClass(() => class extends React.Component<{}, {}> {
+>Foo : Foo
+>createComponentClass(() => class extends React.Component<{}, {}> { render() { return Hello, world!; }}) : React.Component<{}, {}>
+>createComponentClass : (factory: () => React.ComponentClass ) => React.ComponentClass
+>() => class extends React.Component<{}, {}> { render() { return Hello, world!; }} : () => typeof (Anonymous class)
+>class extends React.Component<{}, {}> { render() { return Hello, world!; }} : typeof (Anonymous class)
+>React.Component : React.Component<{}, {}>
+>React : typeof React
+>Component : typeof React.Component
+
+ render() {
+>render : () => any
+
+ return Hello, world!;
+>Hello, world! : any
+>span : any
+>span : any
+ }
+}) {}
diff --git a/tests/cases/compiler/importHelpersInAmbientContext.ts b/tests/cases/compiler/importHelpersInAmbientContext.ts
new file mode 100644
index 00000000000..8bfa5b25404
--- /dev/null
+++ b/tests/cases/compiler/importHelpersInAmbientContext.ts
@@ -0,0 +1,55 @@
+// @importHelpers: true
+// @target: es5
+
+// @filename: a.d.ts
+export { };
+
+// Extends
+declare class C { }
+declare class D extends C { }
+
+// Destructuring
+interface I {
+ ({descendants, read}?: {
+ descendants?: boolean;
+ read?: any;
+ }): any;
+}
+
+
+// Object Rest
+interface Foo {
+ a: number; b: string;
+}
+export var { a, ...x } : Foo;
+
+// @filename: b.ts
+export {};
+declare namespace N {
+ // Extends
+ class C { }
+ class D extends C { }
+
+ // Destructuring
+ interface I {
+ ({descendants, read}?: {
+ descendants?: boolean;
+ read?: any;
+ }): any;
+ }
+
+
+ // Object Rest
+ interface Foo {
+ a: number; b: string;
+ }
+ export var { a, ...x } : Foo;
+}
+
+// @filename: tslib.d.ts
+export declare function __extends(d: Function, b: Function): void;
+export declare function __assign(t: any, ...sources: any[]): any;
+export declare function __decorate(decorators: Function[], target: any, key?: string | symbol, desc?: any): any;
+export declare function __param(paramIndex: number, decorator: Function): Function;
+export declare function __metadata(metadataKey: any, metadataValue: any): Function;
+export declare function __awaiter(thisArg: any, _arguments: any, P: Function, generator: Function): any;
diff --git a/tests/cases/compiler/jsxInExtendsClause.tsx b/tests/cases/compiler/jsxInExtendsClause.tsx
new file mode 100644
index 00000000000..6482a5964e1
--- /dev/null
+++ b/tests/cases/compiler/jsxInExtendsClause.tsx
@@ -0,0 +1,12 @@
+// @jsx: react
+// https://github.com/Microsoft/TypeScript/issues/13157
+declare namespace React {
+ interface ComponentClass { new (): Component