Skip to content

Commit bb76aa7

Browse files
author
Andy Hanson
committed
Fix bug: Report errors on extends expression in JS even if an @augments tag is present
1 parent 7aee3a1 commit bb76aa7

5 files changed

+42
-0
lines changed

src/compiler/checker.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4917,6 +4917,8 @@ namespace ts {
49174917
*/
49184918
function getBaseConstructorTypeOfClass(type: InterfaceType): Type {
49194919
if (!type.resolvedBaseConstructorType) {
4920+
const decl = <ClassLikeDeclaration>type.symbol.valueDeclaration;
4921+
const extended = getClassExtendsHeritageClauseElement(decl);
49204922
const baseTypeNode = getBaseTypeNodeOfClass(type);
49214923
if (!baseTypeNode) {
49224924
return type.resolvedBaseConstructorType = undefinedType;
@@ -4925,6 +4927,10 @@ namespace ts {
49254927
return unknownType;
49264928
}
49274929
const baseConstructorType = checkExpression(baseTypeNode.expression);
4930+
if (extended && baseTypeNode !== extended) {
4931+
Debug.assert(!extended.typeArguments); // Because this is in a JS file, and baseTypeNode is in an @extends tag
4932+
checkExpression(extended.expression);
4933+
}
49284934
if (baseConstructorType.flags & (TypeFlags.Object | TypeFlags.Intersection)) {
49294935
// Resolving the members of a class requires us to resolve the base class of that class.
49304936
// We force resolution here such that we catch circularities now.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/a.js(3,17): error TS2304: Cannot find name 'err'.
2+
3+
4+
==== /a.js (1 errors) ====
5+
class A {}
6+
/** @augments A */
7+
class B extends err() {}
8+
~~~
9+
!!! error TS2304: Cannot find name 'err'.
10+
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
=== /a.js ===
2+
class A {}
3+
>A : Symbol(A, Decl(a.js, 0, 0))
4+
5+
/** @augments A */
6+
class B extends err() {}
7+
>B : Symbol(B, Decl(a.js, 0, 10))
8+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
=== /a.js ===
2+
class A {}
3+
>A : A
4+
5+
/** @augments A */
6+
class B extends err() {}
7+
>B : B
8+
>err() : A
9+
>err : any
10+
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// @allowJs: true
2+
// @checkJs: true
3+
// @noEmit: true
4+
5+
// @Filename: /a.js
6+
class A {}
7+
/** @augments A */
8+
class B extends err() {}

0 commit comments

Comments
 (0)