Skip to content

Commit 9ba2a6b

Browse files
committed
Skip type parameters.
1 parent e001258 commit 9ba2a6b

File tree

8 files changed

+255
-178
lines changed

8 files changed

+255
-178
lines changed

src/compiler/checker.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -858,18 +858,18 @@ namespace ts {
858858
case SyntaxKind.ClassExpression:
859859
case SyntaxKind.InterfaceDeclaration:
860860
if (result = getSymbol(getSymbolOfNode(location).members, name, meaning & SymbolFlags.Type)) {
861+
if (!isTypeParameterSymbolDeclaredInContainer(result, location)) {
862+
// ignore type parameters not declared in this container
863+
result = undefined;
864+
break;
865+
}
861866
if (lastLocation && getModifierFlags(lastLocation) & ModifierFlags.Static) {
862867
// TypeScript 1.0 spec (April 2014): 3.4.1
863868
// The scope of a type parameter extends over the entire declaration with which the type
864869
// parameter list is associated, with the exception of static member declarations in classes.
865870
error(errorLocation, Diagnostics.Static_members_cannot_reference_class_type_parameters);
866871
return undefined;
867872
}
868-
// Only perform additional check if error reporting was requested
869-
if (nameNotFoundMessage && !isTypeParameterSymbolDeclaredInContainer(result, location)) {
870-
error(errorLocation, Diagnostics.Type_parameter_0_cannot_be_referenced_outside_of_the_declaration_that_defines_it, symbolToString(result));
871-
return undefined;
872-
}
873873
break loop;
874874
}
875875
if (location.kind === SyntaxKind.ClassExpression && meaning & SymbolFlags.Class) {

src/compiler/diagnosticMessages.json

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1127,10 +1127,6 @@
11271127
"category": "Error",
11281128
"code": 2366
11291129
},
1130-
"Type parameter '{0}' cannot be referenced outside of the declaration that defines it.": {
1131-
"category": "Error",
1132-
"code": 2367
1133-
},
11341130
"Type parameter name cannot be '{0}'": {
11351131
"category": "Error",
11361132
"code": 2368

tests/baselines/reference/genericDefaults.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,13 @@ const i06c00 = (<i06>x).a;
430430
const i06c01 = (<i06<number>>x).a;
431431
const i06c02 = (<i06<number, string>>x).a;
432432

433+
interface i07 { a: A; }
434+
interface i07<A = number> { b: A; }
435+
const i07c00 = (<i07>x).a;
436+
const i07c01 = (<i07>x).b;
437+
const i07c02 = (<i07<B>>x).a;
438+
const i07c03 = (<i07<B>>x).b;
439+
433440
interface Base01<T> { a: T; }
434441
interface Base01Constructor { new <T = number>(a?: T): Base01<T>; }
435442

@@ -811,6 +818,10 @@ var i05c01 = x.a;
811818
var i06c00 = x.a;
812819
var i06c01 = x.a;
813820
var i06c02 = x.a;
821+
var i07c00 = x.a;
822+
var i07c01 = x.b;
823+
var i07c02 = x.a;
824+
var i07c03 = x.b;
814825
var Base01c00 = new Base01();
815826
var Base01c01 = new Base01(1);
816827
var Base01c02 = new Base01();
@@ -933,6 +944,16 @@ interface i06<T = U, U = T> {
933944
declare const i06c00: [{}, {}];
934945
declare const i06c01: [number, number];
935946
declare const i06c02: [number, string];
947+
interface i07 {
948+
a: A;
949+
}
950+
interface i07<A = number> {
951+
b: A;
952+
}
953+
declare const i07c00: A;
954+
declare const i07c01: number;
955+
declare const i07c02: A;
956+
declare const i07c03: B;
936957
interface Base01<T> {
937958
a: T;
938959
}

tests/baselines/reference/genericDefaults.symbols

Lines changed: 167 additions & 126 deletions
Large diffs are not rendered by default.

tests/baselines/reference/genericDefaults.types

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2301,6 +2301,55 @@ const i06c02 = (<i06<number, string>>x).a;
23012301
>x : any
23022302
>a : [number, string]
23032303

2304+
interface i07 { a: A; }
2305+
>i07 : i07<A>
2306+
>a : A
2307+
>A : A
2308+
2309+
interface i07<A = number> { b: A; }
2310+
>i07 : i07<A>
2311+
>A : A
2312+
>b : A
2313+
>A : A
2314+
2315+
const i07c00 = (<i07>x).a;
2316+
>i07c00 : A
2317+
>(<i07>x).a : A
2318+
>(<i07>x) : i07<number>
2319+
><i07>x : i07<number>
2320+
>i07 : i07<A>
2321+
>x : any
2322+
>a : A
2323+
2324+
const i07c01 = (<i07>x).b;
2325+
>i07c01 : number
2326+
>(<i07>x).b : number
2327+
>(<i07>x) : i07<number>
2328+
><i07>x : i07<number>
2329+
>i07 : i07<A>
2330+
>x : any
2331+
>b : number
2332+
2333+
const i07c02 = (<i07<B>>x).a;
2334+
>i07c02 : A
2335+
>(<i07<B>>x).a : A
2336+
>(<i07<B>>x) : i07<B>
2337+
><i07<B>>x : i07<B>
2338+
>i07 : i07<A>
2339+
>B : B
2340+
>x : any
2341+
>a : A
2342+
2343+
const i07c03 = (<i07<B>>x).b;
2344+
>i07c03 : B
2345+
>(<i07<B>>x).b : B
2346+
>(<i07<B>>x) : i07<B>
2347+
><i07<B>>x : i07<B>
2348+
>i07 : i07<A>
2349+
>B : B
2350+
>x : any
2351+
>b : B
2352+
23042353
interface Base01<T> { a: T; }
23052354
>Base01 : Base01<T>
23062355
>T : T

tests/baselines/reference/genericDefaultsErrors.errors.txt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@ tests/cases/compiler/genericDefaultsErrors.ts(30,32): error TS2344: Type 'number
1717
tests/cases/compiler/genericDefaultsErrors.ts(33,15): error TS2707: Generic type 'i09<T, U, V>' requires between 2 and 3 type arguments.
1818
tests/cases/compiler/genericDefaultsErrors.ts(34,15): error TS2707: Generic type 'i09<T, U, V>' requires between 2 and 3 type arguments.
1919
tests/cases/compiler/genericDefaultsErrors.ts(37,15): error TS2707: Generic type 'i09<T, U, V>' requires between 2 and 3 type arguments.
20-
tests/cases/compiler/genericDefaultsErrors.ts(39,20): error TS2367: Type parameter 'T' cannot be referenced outside of the declaration that defines it.
20+
tests/cases/compiler/genericDefaultsErrors.ts(39,20): error TS2304: Cannot find name 'T'.
21+
tests/cases/compiler/genericDefaultsErrors.ts(39,20): error TS4033: Property 'x' of exported interface has or is using private name 'T'.
2122

2223

23-
==== tests/cases/compiler/genericDefaultsErrors.ts (18 errors) ====
24+
==== tests/cases/compiler/genericDefaultsErrors.ts (19 errors) ====
2425

2526
declare const x: any;
2627

@@ -97,5 +98,7 @@ tests/cases/compiler/genericDefaultsErrors.ts(39,20): error TS2367: Type paramet
9798

9899
interface i10 { x: T; } // error
99100
~
100-
!!! error TS2367: Type parameter 'T' cannot be referenced outside of the declaration that defines it.
101+
!!! error TS2304: Cannot find name 'T'.
102+
~
103+
!!! error TS4033: Property 'x' of exported interface has or is using private name 'T'.
101104
interface i10<T = number> {}

tests/baselines/reference/genericDefaultsErrors.js

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -48,43 +48,3 @@ f11(); // ok
4848
f11(); // error
4949
f12(); // ok
5050
f12("a"); // error
51-
52-
53-
//// [genericDefaultsErrors.d.ts]
54-
declare const x: any;
55-
declare function f03<T extends string = number>(): void;
56-
declare function f04<T extends string, U extends number = T>(): void;
57-
declare function f05<T, U extends number = T>(): void;
58-
declare function f06<T, U extends T = number>(): void;
59-
declare function f11<T, U, V = number>(): void;
60-
declare function f12<T, U = T>(a?: U): void;
61-
interface i00<T> {
62-
}
63-
interface i00<U = number> {
64-
}
65-
interface i01<T = number> {
66-
}
67-
interface i01<T = string> {
68-
}
69-
interface i04<T = number, U> {
70-
}
71-
interface i05<T extends string = number> {
72-
}
73-
interface i06<T extends string, U extends number = T> {
74-
}
75-
interface i07<T, U extends number = T> {
76-
}
77-
interface i08<T, U extends T = number> {
78-
}
79-
interface i09<T, U, V = number> {
80-
}
81-
declare type i09t00 = i09;
82-
declare type i09t01 = i09<1>;
83-
declare type i09t02 = i09<1, 2>;
84-
declare type i09t03 = i09<1, 2, 3>;
85-
declare type i09t04 = i09<1, 2, 3, 4>;
86-
interface i10 {
87-
x: T;
88-
}
89-
interface i10<T = number> {
90-
}

tests/cases/compiler/genericDefaults.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,13 @@ const i06c00 = (<i06>x).a;
430430
const i06c01 = (<i06<number>>x).a;
431431
const i06c02 = (<i06<number, string>>x).a;
432432

433+
interface i07 { a: A; }
434+
interface i07<A = number> { b: A; }
435+
const i07c00 = (<i07>x).a;
436+
const i07c01 = (<i07>x).b;
437+
const i07c02 = (<i07<B>>x).a;
438+
const i07c03 = (<i07<B>>x).b;
439+
433440
interface Base01<T> { a: T; }
434441
interface Base01Constructor { new <T = number>(a?: T): Base01<T>; }
435442

0 commit comments

Comments
 (0)