fix super call from class that has no basetype but with same symbol interface (#19068)

This commit is contained in:
kingwl
2017-10-16 10:39:55 +08:00
parent d4c0377395
commit 30c51ed324
6 changed files with 71 additions and 3 deletions

View File

@@ -13043,12 +13043,14 @@ namespace ts {
// at this point the only legal case for parent is ClassLikeDeclaration
const classLikeDeclaration = <ClassLikeDeclaration>container.parent;
if (!getClassExtendsHeritageClauseElement(classLikeDeclaration)) {
error(node, Diagnostics.super_can_only_be_referenced_in_a_derived_class);
return unknownType;
}
const classType = <InterfaceType>getDeclaredTypeOfSymbol(getSymbolOfNode(classLikeDeclaration));
const baseClassType = classType && getBaseTypes(classType)[0];
if (!baseClassType) {
if (!getClassExtendsHeritageClauseElement(classLikeDeclaration)) {
error(node, Diagnostics.super_can_only_be_referenced_in_a_derived_class);
}
return unknownType;
}

View File

@@ -0,0 +1,14 @@
tests/cases/conformance/es6/classDeclaration/superCallFromClassThatHasNoBaseTypeButWithSameSymbolInterface.ts(5,9): error TS2335: 'super' can only be referenced in a derived class.
==== tests/cases/conformance/es6/classDeclaration/superCallFromClassThatHasNoBaseTypeButWithSameSymbolInterface.ts (1 errors) ====
interface Foo extends Array<number> {}
class Foo {
constructor() {
super(); // error
~~~~~
!!! error TS2335: 'super' can only be referenced in a derived class.
}
}

View File

@@ -0,0 +1,17 @@
//// [superCallFromClassThatHasNoBaseTypeButWithSameSymbolInterface.ts]
interface Foo extends Array<number> {}
class Foo {
constructor() {
super(); // error
}
}
//// [superCallFromClassThatHasNoBaseTypeButWithSameSymbolInterface.js]
var Foo = /** @class */ (function () {
function Foo() {
_this = _super.call(this) || this; // error
}
return Foo;
}());

View File

@@ -0,0 +1,13 @@
=== tests/cases/conformance/es6/classDeclaration/superCallFromClassThatHasNoBaseTypeButWithSameSymbolInterface.ts ===
interface Foo extends Array<number> {}
>Foo : Symbol(Foo, Decl(superCallFromClassThatHasNoBaseTypeButWithSameSymbolInterface.ts, 0, 0), Decl(superCallFromClassThatHasNoBaseTypeButWithSameSymbolInterface.ts, 0, 38))
>Array : Symbol(Array, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
class Foo {
>Foo : Symbol(Foo, Decl(superCallFromClassThatHasNoBaseTypeButWithSameSymbolInterface.ts, 0, 0), Decl(superCallFromClassThatHasNoBaseTypeButWithSameSymbolInterface.ts, 0, 38))
constructor() {
super(); // error
}
}

View File

@@ -0,0 +1,15 @@
=== tests/cases/conformance/es6/classDeclaration/superCallFromClassThatHasNoBaseTypeButWithSameSymbolInterface.ts ===
interface Foo extends Array<number> {}
>Foo : Foo
>Array : T[]
class Foo {
>Foo : Foo
constructor() {
super(); // error
>super() : void
>super : any
}
}

View File

@@ -0,0 +1,7 @@
interface Foo extends Array<number> {}
class Foo {
constructor() {
super(); // error
}
}