Skip to content

Commit 877977a

Browse files
add new tests for extends interface
1 parent 38962ee commit 877977a

10 files changed

Lines changed: 135 additions & 24 deletions

src/compiler/checker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -955,7 +955,7 @@ namespace ts {
955955
return false;
956956
}
957957
const expression = (<ExpressionWithTypeArguments>parentClassExpression).expression;
958-
if (resolveEntityName(expression, SymbolFlags.Interface, true)) {
958+
if (resolveEntityName(expression, SymbolFlags.Interface, /*ignoreErrors*/ true)) {
959959
error(errorLocation, Diagnostics.Cannot_extend_an_interface_0_Did_you_mean_implements, getTextOfNode(expression));
960960
return true;
961961
}

tests/baselines/reference/classExtendsInterface.errors.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ tests/cases/compiler/classExtendsInterface.ts(6,21): error TS2689: Cannot extend
88
~~~~~~~~~~
99
!!! error TS2689: Cannot extend an interface 'Comparable'. Did you mean 'implements'?
1010
class B implements Comparable {}
11-
11+
1212
interface Comparable2<T> {}
1313
class A2<T> extends Comparable2<T> {}
1414
~~~~~~~~~~~

tests/baselines/reference/classExtendsInterface.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
interface Comparable {}
33
class A extends Comparable {}
44
class B implements Comparable {}
5-
5+
66
interface Comparable2<T> {}
77
class A2<T> extends Comparable2<T> {}
88
class B2<T> implements Comparable2<T> {}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
tests/cases/compiler/classExtendsInterfaceInExpression.ts(7,25): error TS2304: Cannot find name 'A'.
2+
3+
4+
==== tests/cases/compiler/classExtendsInterfaceInExpression.ts (1 errors) ====
5+
interface A {}
6+
7+
function factory(a: any): {new(): Object} {
8+
return null
9+
}
10+
11+
class C extends factory(A) {}
12+
~
13+
!!! error TS2304: Cannot find name 'A'.
14+
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
//// [classExtendsInterfaceInExpression.ts]
2+
interface A {}
3+
4+
function factory(a: any): {new(): Object} {
5+
return null
6+
}
7+
8+
class C extends factory(A) {}
9+
10+
11+
//// [classExtendsInterfaceInExpression.js]
12+
var __extends = (this && this.__extends) || function (d, b) {
13+
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
14+
function __() { this.constructor = d; }
15+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
16+
};
17+
function factory(a) {
18+
return null;
19+
}
20+
var C = (function (_super) {
21+
__extends(C, _super);
22+
function C() {
23+
_super.apply(this, arguments);
24+
}
25+
return C;
26+
}(factory(A)));
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
tests/cases/compiler/classExtendsInterfaceInModule.ts(5,18): error TS2689: Cannot extend an interface 'M.I1'. Did you mean 'implements'?
2+
tests/cases/compiler/classExtendsInterfaceInModule.ts(6,21): error TS2689: Cannot extend an interface 'M.I2'. Did you mean 'implements'?
3+
tests/cases/compiler/classExtendsInterfaceInModule.ts(14,17): error TS2689: Cannot extend an interface 'Mod.Nested.I'. Did you mean 'implements'?
4+
5+
6+
==== tests/cases/compiler/classExtendsInterfaceInModule.ts (3 errors) ====
7+
module M {
8+
export interface I1 {}
9+
export interface I2<T> {}
10+
}
11+
class C1 extends M.I1 {}
12+
~
13+
!!! error TS2689: Cannot extend an interface 'M.I1'. Did you mean 'implements'?
14+
class C2<T> extends M.I2<T> {}
15+
~
16+
!!! error TS2689: Cannot extend an interface 'M.I2'. Did you mean 'implements'?
17+
18+
module Mod {
19+
export namespace Nested {
20+
export interface I {}
21+
}
22+
}
23+
24+
class D extends Mod.Nested.I {}
25+
~~~
26+
!!! error TS2689: Cannot extend an interface 'Mod.Nested.I'. Did you mean 'implements'?
27+
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
//// [classExtendsInterfaceInModule.ts]
2+
module M {
3+
export interface I1 {}
4+
export interface I2<T> {}
5+
}
6+
class C1 extends M.I1 {}
7+
class C2<T> extends M.I2<T> {}
8+
9+
module Mod {
10+
export namespace Nested {
11+
export interface I {}
12+
}
13+
}
14+
15+
class D extends Mod.Nested.I {}
16+
17+
18+
//// [classExtendsInterfaceInModule.js]
19+
var __extends = (this && this.__extends) || function (d, b) {
20+
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
21+
function __() { this.constructor = d; }
22+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
23+
};
24+
var C1 = (function (_super) {
25+
__extends(C1, _super);
26+
function C1() {
27+
_super.apply(this, arguments);
28+
}
29+
return C1;
30+
}(M.I1));
31+
var C2 = (function (_super) {
32+
__extends(C2, _super);
33+
function C2() {
34+
_super.apply(this, arguments);
35+
}
36+
return C2;
37+
}(M.I2));
38+
var D = (function (_super) {
39+
__extends(D, _super);
40+
function D() {
41+
_super.apply(this, arguments);
42+
}
43+
return D;
44+
}(Mod.Nested.I));

tests/cases/compiler/classExtendsInterface.ts

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,3 @@ class B implements Comparable {}
55
interface Comparable2<T> {}
66
class A2<T> extends Comparable2<T> {}
77
class B2<T> implements Comparable2<T> {}
8-
9-
function Factory(a: any): {new()} {
10-
return null
11-
}
12-
13-
class C extends Factory(Comparable) {}
14-
15-
module M {
16-
export interface I1 {}
17-
export interface I2<T> {}
18-
}
19-
class C1 extends M.I1 {}
20-
class C2<T> extends M.I2<T> {}
21-
22-
namespace N {
23-
export interface I1 {}
24-
export interface I2<T> {}
25-
}
26-
27-
class D1 extends N.I1 {}
28-
class D2<T> extends N.I2<T> {}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
interface A {}
2+
3+
function factory(a: any): {new(): Object} {
4+
return null
5+
}
6+
7+
class C extends factory(A) {}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
module M {
2+
export interface I1 {}
3+
export interface I2<T> {}
4+
}
5+
class C1 extends M.I1 {}
6+
class C2<T> extends M.I2<T> {}
7+
8+
module Mod {
9+
export namespace Nested {
10+
export interface I {}
11+
}
12+
}
13+
14+
class D extends Mod.Nested.I {}

0 commit comments

Comments
 (0)