Skip to content

Commit 6b2c8cb

Browse files
committed
Defaults for type aliases
1 parent fd228a9 commit 6b2c8cb

File tree

7 files changed

+389
-11
lines changed

7 files changed

+389
-11
lines changed

src/compiler/checker.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5648,7 +5648,7 @@ namespace ts {
56485648
const links = getSymbolLinks(symbol);
56495649
const typeParameters = links.typeParameters;
56505650
const id = getTypeListId(typeArguments);
5651-
return links.instantiations[id] || (links.instantiations[id] = instantiateTypeNoAlias(type, createTypeMapper(typeParameters, typeArguments)));
5651+
return links.instantiations[id] || (links.instantiations[id] = instantiateTypeNoAlias(type, createTypeMapper(typeParameters, fillMissingTypeArguments(typeArguments, typeParameters, links.minTypeArgumentCount))));
56525652
}
56535653

56545654
// Get type from reference to type alias. When a type alias is generic, the declared type of the type alias may include
@@ -16167,6 +16167,9 @@ namespace ts {
1616716167
checkTypeArgumentConstraints(typeParameters, node.typeArguments, minTypeArgumentCount);
1616816168
}
1616916169
}
16170+
if (type.flags & TypeFlags.TypeParameter && !(<TypeParameter>type).isThisType && type.symbol && !isTypeParameterInScope(<TypeParameter>type, node)) {
16171+
error(node, Diagnostics.Type_parameter_0_cannot_be_referenced_outside_of_the_declaration_that_defines_it, symbolToString(type.symbol));
16172+
}
1617016173
if (type.flags & TypeFlags.Enum && !(<EnumType>type).memberTypes && getNodeLinks(node).resolvedSymbol.flags & SymbolFlags.EnumMember) {
1617116174
error(node, Diagnostics.Enum_type_0_has_members_with_initializers_that_are_not_literals, typeToString(type));
1617216175
}
@@ -17583,11 +17586,6 @@ namespace ts {
1758317586
error(node.name, Diagnostics.All_declarations_of_0_must_have_identical_modifiers, declarationNameToString(node.name));
1758417587
}
1758517588
}
17586-
if (type.flags & TypeFlags.TypeParameter && !(<TypeParameter>type).isThisType && type.symbol) {
17587-
if (!isTypeParameterInScope(<TypeParameter>type, node)) {
17588-
error(node.name, Diagnostics.Type_parameter_0_cannot_be_referenced_outside_of_a_declaration_that_defines_it, symbolToString(type.symbol));
17589-
}
17590-
}
1759117589
if (node.kind !== SyntaxKind.PropertyDeclaration && node.kind !== SyntaxKind.PropertySignature) {
1759217590
// We know we don't have a binding pattern or computed name here
1759317591
checkExportsOnMergedDeclarations(node);
@@ -17605,7 +17603,11 @@ namespace ts {
1760517603
function isTypeParameterInScope(typeParameter: TypeParameter, node: Node) {
1760617604
const parents = map(filter(typeParameter.symbol.declarations, isTypeParameter), node => node.parent);
1760717605
while (node) {
17608-
if (isFunctionLike(node) || isClassLike(node) || node.kind === SyntaxKind.InterfaceDeclaration || node.kind === SyntaxKind.TypeAliasDeclaration) {
17606+
if (isFunctionLike(node) ||
17607+
isClassLike(node) ||
17608+
node.kind === SyntaxKind.InterfaceDeclaration ||
17609+
node.kind === SyntaxKind.TypeAliasDeclaration ||
17610+
node.kind === SyntaxKind.MappedType) {
1760917611
if (contains(parents, node)) {
1761017612
return true;
1761117613
}

src/compiler/diagnosticMessages.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1127,7 +1127,7 @@
11271127
"category": "Error",
11281128
"code": 2366
11291129
},
1130-
"Type parameter '{0}' cannot be referenced outside of a declaration that defines it.": {
1130+
"Type parameter '{0}' cannot be referenced outside of the declaration that defines it.": {
11311131
"category": "Error",
11321132
"code": 2367
11331133
},

tests/baselines/reference/genericDefaults.js

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,28 @@ const Derived02c00 = new Derived02();
111111
const Derived02c01 = new Derived02(1);
112112
const Derived02c02 = new Derived02<number>();
113113
const Derived02c03 = new Derived02<number>(1);
114+
115+
type t00<T = number> = { a: T; }
116+
const t00c00 = (<t00>x).a;
117+
const t00c01 = (<t00<number>>x).a;
118+
119+
type t01<T, U = T> = { a: [T, U]; }
120+
const t01c00 = (<t01<number>>x).a;
121+
const t01c01 = (<t01<number, string>>x).a;
122+
123+
type t02<T extends number, U = T> = { a: [T, U]; }
124+
const t02c00 = (<t02<number>>x).a;
125+
const t02c01 = (<t02<1>>x).a;
126+
const t02c02 = (<t02<number, number>>x).a;
127+
const t02c03 = (<t02<1, number>>x).a;
128+
const t02c04 = (<t02<number, 1>>x).a;
129+
130+
type t03<T extends number, U extends T = T> = { a: [T, U]; }
131+
const t03c00 = (<t03<number>>x).a;
132+
const t03c01 = (<t03<1>>x).a;
133+
const t03c02 = (<t03<number, number>>x).a;
134+
const t03c03 = (<t03<1, 1>>x).a;
135+
const t03c04 = (<t03<number, 1>>x).a;
114136

115137

116138
//// [genericDefaults.js]
@@ -191,6 +213,20 @@ var Derived02c00 = new Derived02();
191213
var Derived02c01 = new Derived02(1);
192214
var Derived02c02 = new Derived02();
193215
var Derived02c03 = new Derived02(1);
216+
var t00c00 = x.a;
217+
var t00c01 = x.a;
218+
var t01c00 = x.a;
219+
var t01c01 = x.a;
220+
var t02c00 = x.a;
221+
var t02c01 = x.a;
222+
var t02c02 = x.a;
223+
var t02c03 = x.a;
224+
var t02c04 = x.a;
225+
var t03c00 = x.a;
226+
var t03c01 = x.a;
227+
var t03c02 = x.a;
228+
var t03c03 = x.a;
229+
var t03c04 = x.a;
194230

195231

196232
//// [genericDefaults.d.ts]
@@ -337,3 +373,29 @@ declare const Derived02c00: Derived02<string>;
337373
declare const Derived02c01: Derived02<number>;
338374
declare const Derived02c02: Derived02<number>;
339375
declare const Derived02c03: Derived02<number>;
376+
declare type t00<T = number> = {
377+
a: T;
378+
};
379+
declare const t00c00: number;
380+
declare const t00c01: number;
381+
declare type t01<T, U = T> = {
382+
a: [T, U];
383+
};
384+
declare const t01c00: [number, number];
385+
declare const t01c01: [number, string];
386+
declare type t02<T extends number, U = T> = {
387+
a: [T, U];
388+
};
389+
declare const t02c00: [number, number];
390+
declare const t02c01: [1, 1];
391+
declare const t02c02: [number, number];
392+
declare const t02c03: [1, number];
393+
declare const t02c04: [number, 1];
394+
declare type t03<T extends number, U extends T = T> = {
395+
a: [T, U];
396+
};
397+
declare const t03c00: [number, number];
398+
declare const t03c01: [1, 1];
399+
declare const t03c02: [number, number];
400+
declare const t03c03: [1, 1];
401+
declare const t03c04: [number, 1];

tests/baselines/reference/genericDefaults.symbols

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,3 +506,135 @@ const Derived02c03 = new Derived02<number>(1);
506506
>Derived02c03 : Symbol(Derived02c03, Decl(genericDefaults.ts, 111, 5))
507507
>Derived02 : Symbol(Derived02, Decl(genericDefaults.ts, 105, 46))
508508

509+
type t00<T = number> = { a: T; }
510+
>t00 : Symbol(t00, Decl(genericDefaults.ts, 111, 46))
511+
>T : Symbol(T, Decl(genericDefaults.ts, 113, 9))
512+
>a : Symbol(a, Decl(genericDefaults.ts, 113, 24))
513+
>T : Symbol(T, Decl(genericDefaults.ts, 113, 9))
514+
515+
const t00c00 = (<t00>x).a;
516+
>t00c00 : Symbol(t00c00, Decl(genericDefaults.ts, 114, 5))
517+
>(<t00>x).a : Symbol(a, Decl(genericDefaults.ts, 113, 24))
518+
>t00 : Symbol(t00, Decl(genericDefaults.ts, 111, 46))
519+
>x : Symbol(x, Decl(genericDefaults.ts, 0, 13))
520+
>a : Symbol(a, Decl(genericDefaults.ts, 113, 24))
521+
522+
const t00c01 = (<t00<number>>x).a;
523+
>t00c01 : Symbol(t00c01, Decl(genericDefaults.ts, 115, 5))
524+
>(<t00<number>>x).a : Symbol(a, Decl(genericDefaults.ts, 113, 24))
525+
>t00 : Symbol(t00, Decl(genericDefaults.ts, 111, 46))
526+
>x : Symbol(x, Decl(genericDefaults.ts, 0, 13))
527+
>a : Symbol(a, Decl(genericDefaults.ts, 113, 24))
528+
529+
type t01<T, U = T> = { a: [T, U]; }
530+
>t01 : Symbol(t01, Decl(genericDefaults.ts, 115, 34))
531+
>T : Symbol(T, Decl(genericDefaults.ts, 117, 9))
532+
>U : Symbol(U, Decl(genericDefaults.ts, 117, 11))
533+
>T : Symbol(T, Decl(genericDefaults.ts, 117, 9))
534+
>a : Symbol(a, Decl(genericDefaults.ts, 117, 22))
535+
>T : Symbol(T, Decl(genericDefaults.ts, 117, 9))
536+
>U : Symbol(U, Decl(genericDefaults.ts, 117, 11))
537+
538+
const t01c00 = (<t01<number>>x).a;
539+
>t01c00 : Symbol(t01c00, Decl(genericDefaults.ts, 118, 5))
540+
>(<t01<number>>x).a : Symbol(a, Decl(genericDefaults.ts, 117, 22))
541+
>t01 : Symbol(t01, Decl(genericDefaults.ts, 115, 34))
542+
>x : Symbol(x, Decl(genericDefaults.ts, 0, 13))
543+
>a : Symbol(a, Decl(genericDefaults.ts, 117, 22))
544+
545+
const t01c01 = (<t01<number, string>>x).a;
546+
>t01c01 : Symbol(t01c01, Decl(genericDefaults.ts, 119, 5))
547+
>(<t01<number, string>>x).a : Symbol(a, Decl(genericDefaults.ts, 117, 22))
548+
>t01 : Symbol(t01, Decl(genericDefaults.ts, 115, 34))
549+
>x : Symbol(x, Decl(genericDefaults.ts, 0, 13))
550+
>a : Symbol(a, Decl(genericDefaults.ts, 117, 22))
551+
552+
type t02<T extends number, U = T> = { a: [T, U]; }
553+
>t02 : Symbol(t02, Decl(genericDefaults.ts, 119, 42))
554+
>T : Symbol(T, Decl(genericDefaults.ts, 121, 9))
555+
>U : Symbol(U, Decl(genericDefaults.ts, 121, 26))
556+
>T : Symbol(T, Decl(genericDefaults.ts, 121, 9))
557+
>a : Symbol(a, Decl(genericDefaults.ts, 121, 37))
558+
>T : Symbol(T, Decl(genericDefaults.ts, 121, 9))
559+
>U : Symbol(U, Decl(genericDefaults.ts, 121, 26))
560+
561+
const t02c00 = (<t02<number>>x).a;
562+
>t02c00 : Symbol(t02c00, Decl(genericDefaults.ts, 122, 5))
563+
>(<t02<number>>x).a : Symbol(a, Decl(genericDefaults.ts, 121, 37))
564+
>t02 : Symbol(t02, Decl(genericDefaults.ts, 119, 42))
565+
>x : Symbol(x, Decl(genericDefaults.ts, 0, 13))
566+
>a : Symbol(a, Decl(genericDefaults.ts, 121, 37))
567+
568+
const t02c01 = (<t02<1>>x).a;
569+
>t02c01 : Symbol(t02c01, Decl(genericDefaults.ts, 123, 5))
570+
>(<t02<1>>x).a : Symbol(a, Decl(genericDefaults.ts, 121, 37))
571+
>t02 : Symbol(t02, Decl(genericDefaults.ts, 119, 42))
572+
>x : Symbol(x, Decl(genericDefaults.ts, 0, 13))
573+
>a : Symbol(a, Decl(genericDefaults.ts, 121, 37))
574+
575+
const t02c02 = (<t02<number, number>>x).a;
576+
>t02c02 : Symbol(t02c02, Decl(genericDefaults.ts, 124, 5))
577+
>(<t02<number, number>>x).a : Symbol(a, Decl(genericDefaults.ts, 121, 37))
578+
>t02 : Symbol(t02, Decl(genericDefaults.ts, 119, 42))
579+
>x : Symbol(x, Decl(genericDefaults.ts, 0, 13))
580+
>a : Symbol(a, Decl(genericDefaults.ts, 121, 37))
581+
582+
const t02c03 = (<t02<1, number>>x).a;
583+
>t02c03 : Symbol(t02c03, Decl(genericDefaults.ts, 125, 5))
584+
>(<t02<1, number>>x).a : Symbol(a, Decl(genericDefaults.ts, 121, 37))
585+
>t02 : Symbol(t02, Decl(genericDefaults.ts, 119, 42))
586+
>x : Symbol(x, Decl(genericDefaults.ts, 0, 13))
587+
>a : Symbol(a, Decl(genericDefaults.ts, 121, 37))
588+
589+
const t02c04 = (<t02<number, 1>>x).a;
590+
>t02c04 : Symbol(t02c04, Decl(genericDefaults.ts, 126, 5))
591+
>(<t02<number, 1>>x).a : Symbol(a, Decl(genericDefaults.ts, 121, 37))
592+
>t02 : Symbol(t02, Decl(genericDefaults.ts, 119, 42))
593+
>x : Symbol(x, Decl(genericDefaults.ts, 0, 13))
594+
>a : Symbol(a, Decl(genericDefaults.ts, 121, 37))
595+
596+
type t03<T extends number, U extends T = T> = { a: [T, U]; }
597+
>t03 : Symbol(t03, Decl(genericDefaults.ts, 126, 37))
598+
>T : Symbol(T, Decl(genericDefaults.ts, 128, 9))
599+
>U : Symbol(U, Decl(genericDefaults.ts, 128, 26))
600+
>T : Symbol(T, Decl(genericDefaults.ts, 128, 9))
601+
>T : Symbol(T, Decl(genericDefaults.ts, 128, 9))
602+
>a : Symbol(a, Decl(genericDefaults.ts, 128, 47))
603+
>T : Symbol(T, Decl(genericDefaults.ts, 128, 9))
604+
>U : Symbol(U, Decl(genericDefaults.ts, 128, 26))
605+
606+
const t03c00 = (<t03<number>>x).a;
607+
>t03c00 : Symbol(t03c00, Decl(genericDefaults.ts, 129, 5))
608+
>(<t03<number>>x).a : Symbol(a, Decl(genericDefaults.ts, 128, 47))
609+
>t03 : Symbol(t03, Decl(genericDefaults.ts, 126, 37))
610+
>x : Symbol(x, Decl(genericDefaults.ts, 0, 13))
611+
>a : Symbol(a, Decl(genericDefaults.ts, 128, 47))
612+
613+
const t03c01 = (<t03<1>>x).a;
614+
>t03c01 : Symbol(t03c01, Decl(genericDefaults.ts, 130, 5))
615+
>(<t03<1>>x).a : Symbol(a, Decl(genericDefaults.ts, 128, 47))
616+
>t03 : Symbol(t03, Decl(genericDefaults.ts, 126, 37))
617+
>x : Symbol(x, Decl(genericDefaults.ts, 0, 13))
618+
>a : Symbol(a, Decl(genericDefaults.ts, 128, 47))
619+
620+
const t03c02 = (<t03<number, number>>x).a;
621+
>t03c02 : Symbol(t03c02, Decl(genericDefaults.ts, 131, 5))
622+
>(<t03<number, number>>x).a : Symbol(a, Decl(genericDefaults.ts, 128, 47))
623+
>t03 : Symbol(t03, Decl(genericDefaults.ts, 126, 37))
624+
>x : Symbol(x, Decl(genericDefaults.ts, 0, 13))
625+
>a : Symbol(a, Decl(genericDefaults.ts, 128, 47))
626+
627+
const t03c03 = (<t03<1, 1>>x).a;
628+
>t03c03 : Symbol(t03c03, Decl(genericDefaults.ts, 132, 5))
629+
>(<t03<1, 1>>x).a : Symbol(a, Decl(genericDefaults.ts, 128, 47))
630+
>t03 : Symbol(t03, Decl(genericDefaults.ts, 126, 37))
631+
>x : Symbol(x, Decl(genericDefaults.ts, 0, 13))
632+
>a : Symbol(a, Decl(genericDefaults.ts, 128, 47))
633+
634+
const t03c04 = (<t03<number, 1>>x).a;
635+
>t03c04 : Symbol(t03c04, Decl(genericDefaults.ts, 133, 5))
636+
>(<t03<number, 1>>x).a : Symbol(a, Decl(genericDefaults.ts, 128, 47))
637+
>t03 : Symbol(t03, Decl(genericDefaults.ts, 126, 37))
638+
>x : Symbol(x, Decl(genericDefaults.ts, 0, 13))
639+
>a : Symbol(a, Decl(genericDefaults.ts, 128, 47))
640+

0 commit comments

Comments
 (0)