Skip to content

Commit a2be5e2

Browse files
committed
Report error using type parameter from merged declaration
1 parent 5ff0f81 commit a2be5e2

File tree

5 files changed

+43
-4
lines changed

5 files changed

+43
-4
lines changed

src/compiler/checker.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17594,6 +17594,11 @@ namespace ts {
1759417594
error(node.name, Diagnostics.All_declarations_of_0_must_have_identical_modifiers, declarationNameToString(node.name));
1759517595
}
1759617596
}
17597+
if (type.flags & TypeFlags.TypeParameter && !(<TypeParameter>type).isThisType && type.symbol) {
17598+
if (!isTypeParameterInScope(<TypeParameter>type, node)) {
17599+
error(node.name, Diagnostics.Type_parameter_0_cannot_be_referenced_outside_of_a_declaration_that_defines_it, symbolToString(type.symbol));
17600+
}
17601+
}
1759717602
if (node.kind !== SyntaxKind.PropertyDeclaration && node.kind !== SyntaxKind.PropertySignature) {
1759817603
// We know we don't have a binding pattern or computed name here
1759917604
checkExportsOnMergedDeclarations(node);
@@ -17608,6 +17613,19 @@ namespace ts {
1760817613
}
1760917614
}
1761017615

17616+
function isTypeParameterInScope(typeParameter: TypeParameter, node: Node) {
17617+
const parents = map(filter(typeParameter.symbol.declarations, isTypeParameter), node => node.parent);
17618+
while (node) {
17619+
if (isFunctionLike(node) || isClassLike(node) || node.kind === SyntaxKind.InterfaceDeclaration || node.kind === SyntaxKind.TypeAliasDeclaration) {
17620+
if (contains(parents, node)) {
17621+
return true;
17622+
}
17623+
}
17624+
node = node.parent;
17625+
}
17626+
return false;
17627+
}
17628+
1761117629
function areDeclarationFlagsIdentical(left: Declaration, right: Declaration) {
1761217630
if ((left.kind === SyntaxKind.Parameter && right.kind === SyntaxKind.VariableDeclaration) ||
1761317631
(left.kind === SyntaxKind.VariableDeclaration && right.kind === SyntaxKind.Parameter)) {

src/compiler/diagnosticMessages.json

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

tests/baselines/reference/genericDefaultsErrors.errors.txt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,10 @@ tests/cases/compiler/genericDefaultsErrors.ts(35,32): error TS2344: Type 'number
3131
tests/cases/compiler/genericDefaultsErrors.ts(38,15): error TS2707: Generic type 'i09<T, U, V>' requires between 2 and 3 type arguments.
3232
tests/cases/compiler/genericDefaultsErrors.ts(39,15): error TS2707: Generic type 'i09<T, U, V>' requires between 2 and 3 type arguments.
3333
tests/cases/compiler/genericDefaultsErrors.ts(42,15): error TS2707: Generic type 'i09<T, U, V>' requires between 2 and 3 type arguments.
34+
tests/cases/compiler/genericDefaultsErrors.ts(44,17): error TS2367: Type parameter 'T' cannot be referenced outside of a declaration that defines it.
3435

3536

36-
==== tests/cases/compiler/genericDefaultsErrors.ts (31 errors) ====
37+
==== tests/cases/compiler/genericDefaultsErrors.ts (32 errors) ====
3738

3839
declare const x: any;
3940

@@ -139,4 +140,9 @@ tests/cases/compiler/genericDefaultsErrors.ts(42,15): error TS2707: Generic type
139140
type i09t03 = i09<1, 2, 3>; // ok
140141
type i09t04 = i09<1, 2, 3, 4>; // error
141142
~~~~~~~~~~~~~~~
142-
!!! error TS2707: Generic type 'i09<T, U, V>' requires between 2 and 3 type arguments.
143+
!!! error TS2707: Generic type 'i09<T, U, V>' requires between 2 and 3 type arguments.
144+
145+
interface i10 { x: T; } // error
146+
~
147+
!!! error TS2367: Type parameter 'T' cannot be referenced outside of a declaration that defines it.
148+
interface i10<T = number> {}

tests/baselines/reference/genericDefaultsErrors.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,10 @@ type i09t00 = i09; // error
4040
type i09t01 = i09<1>; // error
4141
type i09t02 = i09<1, 2>; // ok
4242
type i09t03 = i09<1, 2, 3>; // ok
43-
type i09t04 = i09<1, 2, 3, 4>; // error
43+
type i09t04 = i09<1, 2, 3, 4>; // error
44+
45+
interface i10 { x: T; } // error
46+
interface i10<T = number> {}
4447

4548
//// [genericDefaultsErrors.js]
4649
f11(); // ok
@@ -101,3 +104,8 @@ declare type i09t01 = i09<1>;
101104
declare type i09t02 = i09<1, 2>;
102105
declare type i09t03 = i09<1, 2, 3>;
103106
declare type i09t04 = i09<1, 2, 3, 4>;
107+
interface i10 {
108+
x: T;
109+
}
110+
interface i10<T = number> {
111+
}

tests/cases/compiler/genericDefaultsErrors.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,7 @@ type i09t00 = i09; // error
4040
type i09t01 = i09<1>; // error
4141
type i09t02 = i09<1, 2>; // ok
4242
type i09t03 = i09<1, 2, 3>; // ok
43-
type i09t04 = i09<1, 2, 3, 4>; // error
43+
type i09t04 = i09<1, 2, 3, 4>; // error
44+
45+
interface i10 { x: T; } // error
46+
interface i10<T = number> {}

0 commit comments

Comments
 (0)