Unconditionally compute type arguments of class base type
This commit is contained in:
parent
38ece3b703
commit
ce1e0097f0
|
@ -4846,6 +4846,7 @@ namespace ts {
|
|||
return;
|
||||
}
|
||||
const baseTypeNode = getBaseTypeNodeOfClass(type);
|
||||
const typeArgs = typeArgumentsFromTypeReferenceNode(baseTypeNode);
|
||||
let baseType: Type;
|
||||
const originalBaseType = baseConstructorType && baseConstructorType.symbol ? getDeclaredTypeOfSymbol(baseConstructorType.symbol) : undefined;
|
||||
if (baseConstructorType.symbol && baseConstructorType.symbol.flags & SymbolFlags.Class &&
|
||||
|
@ -4853,7 +4854,7 @@ namespace ts {
|
|||
// 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
|
||||
// class and all return the instance type of the class. There is no need for further checks and we can apply the
|
||||
// type arguments in the same manner as a type reference to get the same error reporting experience.
|
||||
baseType = getTypeFromClassOrInterfaceReference(baseTypeNode, baseConstructorType.symbol, typeArgumentsFromTypeReferenceNode(baseTypeNode));
|
||||
baseType = getTypeFromClassOrInterfaceReference(baseTypeNode, baseConstructorType.symbol, typeArgs);
|
||||
}
|
||||
else if (baseConstructorType.flags & TypeFlags.Any) {
|
||||
baseType = baseConstructorType;
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts1.ts(1,17): error TS2304: Cannot find name 'A'.
|
||||
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts1.ts(1,19): error TS2304: Cannot find name 'T'.
|
||||
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts1.ts(1,33): error TS2304: Cannot find name 'B'.
|
||||
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts1.ts(1,35): error TS2304: Cannot find name 'T'.
|
||||
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
|
|||
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts1.ts(14,18): error TS2304: Cannot find name 'T'.
|
||||
|
||||
|
||||
==== tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts1.ts (17 errors) ====
|
||||
==== tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts1.ts (18 errors) ====
|
||||
class C extends A<T> implements B<T> {
|
||||
~
|
||||
!!! error TS2304: Cannot find name 'A'.
|
||||
~
|
||||
!!! error TS2304: Cannot find name 'T'.
|
||||
~
|
||||
!!! error TS2304: Cannot find name 'B'.
|
||||
~
|
||||
|
|
|
@ -1,4 +1,9 @@
|
|||
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts(1,17): error TS2304: Cannot find name 'A'.
|
||||
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts(1,19): error TS2304: Cannot find name 'X'.
|
||||
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts(1,21): error TS2304: Cannot find name 'T'.
|
||||
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts(1,25): error TS2304: Cannot find name 'Y'.
|
||||
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts(1,27): error TS2304: Cannot find name 'Z'.
|
||||
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts(1,29): error TS2304: Cannot find name 'T'.
|
||||
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts(1,45): error TS2304: Cannot find name 'B'.
|
||||
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts(1,47): error TS2304: Cannot find name 'X'.
|
||||
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
|
|||
tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts(14,28): error TS2304: Cannot find name 'T'.
|
||||
|
||||
|
||||
==== tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts (49 errors) ====
|
||||
==== tests/cases/conformance/parser/ecmascript5/Generics/parserGenericsInTypeContexts2.ts (54 errors) ====
|
||||
class C extends A<X<T>, Y<Z<T>>> implements B<X<T>, Y<Z<T>>> {
|
||||
~
|
||||
!!! error TS2304: Cannot find name 'A'.
|
||||
~
|
||||
!!! error TS2304: Cannot find name 'X'.
|
||||
~
|
||||
!!! error TS2304: Cannot find name 'T'.
|
||||
~
|
||||
!!! error TS2304: Cannot find name 'Y'.
|
||||
~
|
||||
!!! error TS2304: Cannot find name 'Z'.
|
||||
~
|
||||
!!! error TS2304: Cannot find name 'T'.
|
||||
~
|
||||
!!! error TS2304: Cannot find name 'B'.
|
||||
~
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
/classReference.ts(4,24): error TS2315: Type 'C' is not generic.
|
||||
/interface.ts(1,21): error TS2307: Cannot find module 'unknown'.
|
||||
/new.ts(1,21): error TS2307: Cannot find module 'unkown'.
|
||||
/super.ts(1,19): error TS2307: Cannot find module 'unknown'.
|
||||
/super.ts(1,22): error TS2307: Cannot find module 'unknown'.
|
||||
/super.ts(8,17): error TS2304: Cannot find name 'InvalidReference'.
|
||||
/typeReference.ts(6,17): error TS2315: Type 'U' is not generic.
|
||||
|
||||
|
@ -61,13 +61,13 @@
|
|||
!!! error TS2304: Cannot find name 'InvalidReference'.
|
||||
|
||||
==== /super.ts (2 errors) ====
|
||||
import { C } from "unknown";
|
||||
~~~~~~~~~
|
||||
import { A, B } from "unknown";
|
||||
~~~~~~~~~
|
||||
!!! error TS2307: Cannot find module 'unknown'.
|
||||
|
||||
type T = number;
|
||||
|
||||
export class D extends C {
|
||||
export class C extends A<B> {
|
||||
m() {
|
||||
super.m<T>(1);
|
||||
super.m<InvalidReference>(); // Should get error for type argument
|
||||
|
|
|
@ -35,11 +35,11 @@ g<U>();
|
|||
g<InvalidReference>(); // Should get error for type argument
|
||||
|
||||
//// [super.ts]
|
||||
import { C } from "unknown";
|
||||
import { A, B } from "unknown";
|
||||
|
||||
type T = number;
|
||||
|
||||
export class D extends C {
|
||||
export class C extends A<B> {
|
||||
m() {
|
||||
super.m<T>(1);
|
||||
super.m<InvalidReference>(); // Should get error for type argument
|
||||
|
@ -108,15 +108,15 @@ var __extends = (this && this.__extends) || (function () {
|
|||
})();
|
||||
exports.__esModule = true;
|
||||
var unknown_1 = require("unknown");
|
||||
var D = (function (_super) {
|
||||
__extends(D, _super);
|
||||
function D() {
|
||||
var C = (function (_super) {
|
||||
__extends(C, _super);
|
||||
function C() {
|
||||
return _super !== null && _super.apply(this, arguments) || this;
|
||||
}
|
||||
D.prototype.m = function () {
|
||||
C.prototype.m = function () {
|
||||
_super.prototype.m.call(this, 1);
|
||||
_super.prototype.m.call(this); // Should get error for type argument
|
||||
};
|
||||
return D;
|
||||
}(unknown_1.C));
|
||||
exports.D = D;
|
||||
return C;
|
||||
}(unknown_1.A));
|
||||
exports.C = C;
|
||||
|
|
|
@ -34,11 +34,11 @@ g<U>();
|
|||
g<InvalidReference>(); // Should get error for type argument
|
||||
|
||||
// @Filename: /super.ts
|
||||
import { C } from "unknown";
|
||||
import { A, B } from "unknown";
|
||||
|
||||
type T = number;
|
||||
|
||||
export class D extends C {
|
||||
export class C extends A<B> {
|
||||
m() {
|
||||
super.m<T>(1);
|
||||
super.m<InvalidReference>(); // Should get error for type argument
|
||||
|
|
Loading…
Reference in a new issue