Skip to content

Commit 616edae

Browse files
author
Andy
authored
Merge pull request #15954 from Microsoft/typeArgs
Unconditionally compute type arguments of class base type
2 parents 4cd20b1 + ce1e009 commit 616edae

File tree

6 files changed

+37
-18
lines changed

6 files changed

+37
-18
lines changed

src/compiler/checker.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4852,14 +4852,15 @@ namespace ts {
48524852
return;
48534853
}
48544854
const baseTypeNode = getBaseTypeNodeOfClass(type);
4855+
const typeArgs = typeArgumentsFromTypeReferenceNode(baseTypeNode);
48554856
let baseType: Type;
48564857
const originalBaseType = baseConstructorType && baseConstructorType.symbol ? getDeclaredTypeOfSymbol(baseConstructorType.symbol) : undefined;
48574858
if (baseConstructorType.symbol && baseConstructorType.symbol.flags & SymbolFlags.Class &&
48584859
areAllOuterTypeParametersApplied(originalBaseType)) {
48594860
// When base constructor type is a class with no captured type arguments we know that the constructors all have the same type parameters as the
48604861
// class and all return the instance type of the class. There is no need for further checks and we can apply the
48614862
// type arguments in the same manner as a type reference to get the same error reporting experience.
4862-
baseType = getTypeFromClassOrInterfaceReference(baseTypeNode, baseConstructorType.symbol, typeArgumentsFromTypeReferenceNode(baseTypeNode));
4863+
baseType = getTypeFromClassOrInterfaceReference(baseTypeNode, baseConstructorType.symbol, typeArgs);
48634864
}
48644865
else if (baseConstructorType.flags & TypeFlags.Any) {
48654866
baseType = baseConstructorType;

tests/baselines/reference/parserGenericsInTypeContexts1.errors.txt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts1.ts(1,17): error TS2304: Cannot find name 'A'.
2+
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts1.ts(1,19): error TS2304: Cannot find name 'T'.
23
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts1.ts(1,33): error TS2304: Cannot find name 'B'.
34
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts1.ts(1,35): error TS2304: Cannot find name 'T'.
45
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts1.ts(4,9): error TS2315: Type 'C' is not generic.
@@ -17,10 +18,12 @@ tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts
1718
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts1.ts(14,18): error TS2304: Cannot find name 'T'.
1819

1920

20-
==== tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts1.ts (17 errors) ====
21+
==== tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts1.ts (18 errors) ====
2122
class C extends A<T> implements B<T> {
2223
~
2324
!!! error TS2304: Cannot find name 'A'.
25+
~
26+
!!! error TS2304: Cannot find name 'T'.
2427
~
2528
!!! error TS2304: Cannot find name 'B'.
2629
~

tests/baselines/reference/parserGenericsInTypeContexts2.errors.txt

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts(1,17): error TS2304: Cannot find name 'A'.
2+
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts(1,19): error TS2304: Cannot find name 'X'.
3+
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts(1,21): error TS2304: Cannot find name 'T'.
4+
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts(1,25): error TS2304: Cannot find name 'Y'.
5+
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts(1,27): error TS2304: Cannot find name 'Z'.
6+
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts(1,29): error TS2304: Cannot find name 'T'.
27
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts(1,45): error TS2304: Cannot find name 'B'.
38
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts(1,47): error TS2304: Cannot find name 'X'.
49
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts(1,49): error TS2304: Cannot find name 'T'.
@@ -49,10 +54,20 @@ tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts
4954
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts(14,28): error TS2304: Cannot find name 'T'.
5055

5156

52-
==== tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts (49 errors) ====
57+
==== tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts (54 errors) ====
5358
class C extends A<X<T>, Y<Z<T>>> implements B<X<T>, Y<Z<T>>> {
5459
~
5560
!!! error TS2304: Cannot find name 'A'.
61+
~
62+
!!! error TS2304: Cannot find name 'X'.
63+
~
64+
!!! error TS2304: Cannot find name 'T'.
65+
~
66+
!!! error TS2304: Cannot find name 'Y'.
67+
~
68+
!!! error TS2304: Cannot find name 'Z'.
69+
~
70+
!!! error TS2304: Cannot find name 'T'.
5671
~
5772
!!! error TS2304: Cannot find name 'B'.
5873
~

tests/baselines/reference/unusedInvalidTypeArguments.errors.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
/classReference.ts(4,24): error TS2315: Type 'C' is not generic.
66
/interface.ts(1,21): error TS2307: Cannot find module 'unknown'.
77
/new.ts(1,21): error TS2307: Cannot find module 'unkown'.
8-
/super.ts(1,19): error TS2307: Cannot find module 'unknown'.
8+
/super.ts(1,22): error TS2307: Cannot find module 'unknown'.
99
/super.ts(8,17): error TS2304: Cannot find name 'InvalidReference'.
1010
/typeReference.ts(6,17): error TS2315: Type 'U' is not generic.
1111

@@ -61,13 +61,13 @@
6161
!!! error TS2304: Cannot find name 'InvalidReference'.
6262

6363
==== /super.ts (2 errors) ====
64-
import { C } from "unknown";
65-
~~~~~~~~~
64+
import { A, B } from "unknown";
65+
~~~~~~~~~
6666
!!! error TS2307: Cannot find module 'unknown'.
6767

6868
type T = number;
6969

70-
export class D extends C {
70+
export class C extends A<B> {
7171
m() {
7272
super.m<T>(1);
7373
super.m<InvalidReference>(); // Should get error for type argument

tests/baselines/reference/unusedInvalidTypeArguments.js

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ g<U>();
3535
g<InvalidReference>(); // Should get error for type argument
3636

3737
//// [super.ts]
38-
import { C } from "unknown";
38+
import { A, B } from "unknown";
3939

4040
type T = number;
4141

42-
export class D extends C {
42+
export class C extends A<B> {
4343
m() {
4444
super.m<T>(1);
4545
super.m<InvalidReference>(); // Should get error for type argument
@@ -108,15 +108,15 @@ var __extends = (this && this.__extends) || (function () {
108108
})();
109109
exports.__esModule = true;
110110
var unknown_1 = require("unknown");
111-
var D = (function (_super) {
112-
__extends(D, _super);
113-
function D() {
111+
var C = (function (_super) {
112+
__extends(C, _super);
113+
function C() {
114114
return _super !== null && _super.apply(this, arguments) || this;
115115
}
116-
D.prototype.m = function () {
116+
C.prototype.m = function () {
117117
_super.prototype.m.call(this, 1);
118118
_super.prototype.m.call(this); // Should get error for type argument
119119
};
120-
return D;
121-
}(unknown_1.C));
122-
exports.D = D;
120+
return C;
121+
}(unknown_1.A));
122+
exports.C = C;

tests/cases/compiler/unusedInvalidTypeArguments.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,11 @@ g<U>();
3434
g<InvalidReference>(); // Should get error for type argument
3535

3636
// @Filename: /super.ts
37-
import { C } from "unknown";
37+
import { A, B } from "unknown";
3838

3939
type T = number;
4040

41-
export class D extends C {
41+
export class C extends A<B> {
4242
m() {
4343
super.m<T>(1);
4444
super.m<InvalidReference>(); // Should get error for type argument

0 commit comments

Comments
 (0)