8000 Handle multiple levels of substitutions and indexed accesses in getAc… · weswigham/TypeScript@b579516 · GitHub
[go: up one dir, main page]

Skip to content

Commit b579516

Browse files
authored
Handle multiple levels of substitutions and indexed accesses in getActualTypeVariable (microsoft#52848)
1 parent 38b951e commit b579516

File tree

5 files changed

+189
-1
lines changed

5 files changed

+189
-1
lines changed

src/compiler/checker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17625,7 +17625,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1762517625

1762617626
function getActualTypeVariable(type: Type): Type {
1762717627
if (type.flags & TypeFlags.Substitution) {
17628-
return (type as SubstitutionType).baseType;
17628+
return getActualTypeVariable((type as SubstitutionType).baseType);
1762917629
}
1763017630
if (type.flags & TypeFlags.IndexedAccess && (
1763117631
(type as IndexedAccessType).objectType.flags & TypeFlags.Substitution ||
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
//// [inferRestArgumentsMappedTuple.ts]
2+
type MyMappedType<Primitive extends any> = {
3+
primitive: Primitive;
4+
};
5+
6+
type TupleMapperOld<Tuple extends any[]> = {
7+
[Key in keyof Tuple]: Tuple[Key] extends Tuple[number] ? MyMappedType<Tuple[Key]> : never;
8+
};
9+
10+
type MyMappedTupleOld = TupleMapperOld<[string, number]>; // [MyMappedType<string>, MyMappedType<number>]
11+
12+
declare function extractPrimitivesOld<Tuple extends any[]>(...mappedTypes: TupleMapperOld<Tuple>): Tuple;
13+
14+
const myPrimitiveTupleOld: [string, number] = extractPrimitivesOld({ primitive: "" }, { primitive: 0 });
15+
16+
type TupleMapperNew<Tuple extends any[]> = {
17+
[Key in keyof Tuple]: MyMappedType<Tuple[Key]>;
18+
};
19+
20+
type MyMappedTupleNew = TupleMapperNew<[string, number]>;
21+
22+
declare function extractPrimitivesNew<Tuple extends any[]>(...mappedTypes: TupleMapperNew<Tuple>): Tuple;
23+
24+
const myPrimitiveTupleNew: [string, number] = extractPrimitivesNew({ primitive: "" }, { primitive: 0 });
25+
26+
27+
//// [inferRestArgumentsMappedTuple.js]
28+
"use strict";
29+
var myPrimitiveTupleOld = extractPrimitivesOld({ primitive: "" }, { primitive: 0 });
30+
var myPrimitiveTupleNew = extractPrimitivesNew({ primitive: "" }, { primitive: 0 });
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
=== tests/cases/compiler/inferRestArgumentsMappedTuple.ts ===
2+
type MyMappedType<Primitive extends any> = {
3+
>MyMappedType : Symbol(MyMappedType, Decl(inferRestArgumentsMappedTuple.ts, 0, 0))
4+
>Primitive : Symbol(Primitive, Decl(inferRestArgumentsMappedTuple.ts, 0, 18))
5+
6+
primitive: Primitive;
7+
>primitive : Symbol(primitive, Decl(inferRestArgumentsMappedTuple.ts, 0, 44))
8+
>Primitive : Symbol(Primitive, Decl(inferRestArgumentsMappedTuple.ts, 0, 18))
9+
10+
};
11+
12+
type TupleMapperOld<Tuple extends any[]> = {
13+
>TupleMapperOld : Symbol(TupleMapperOld, Decl(inferRestArgumentsMappedTuple.ts, 2, 2))
14+
>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 4, 20))
15+
16+
[Key in keyof Tuple]: Tuple[Key] extends Tuple[number] ? MyMappedType<Tuple[Key]> : never;
17+
>Key : Symbol(Key, Decl(inferRestArgumentsMappedTuple.ts, 5, 2))
18+
>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 4, 20))
19+
>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 4, 20))
20+
>Key : Symbol(Key, Decl(inferRestArgumentsMappedTuple.ts, 5, 2))
21+
>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 4, 20))
22+
>MyMappedType : Symbol(MyMappedType, Decl(inferRestArgumentsMappedTuple.ts, 0, 0))
23+
>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 4, 20))
24+
>Key : Symbol(Key, Decl(inferRestArgumentsMappedTuple.ts, 5, 2))
25+
26+
};
27+
28+
type MyMappedTupleOld = TupleMapperOld<[string, number]>; // [MyMappedType<string>, MyMappedType<number>]
29+
>MyMappedTupleOld : Symbol(MyMappedTupleOld, Decl(inferRestArgumentsMappedTuple.ts, 6, 2))
30+
>TupleMapperOld : Symbol(TupleMapperOld, Decl(inferRestArgumentsMappedTuple.ts, 2, 2))
31+
32+
declare function extractPrimitivesOld<Tuple extends any[]>(...mappedTypes: TupleMapperOld<Tuple>): Tuple;
33+
>extractPrimitivesOld : Symbol(extractPrimitivesOld, Decl(inferRestArgumentsMappedTuple.ts, 8, 57))
34+
>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 10, 38))
35+
>mappedTypes : Symbol(mappedTypes, Decl(inferRestArgumentsMappedTuple.ts, 10, 59))
36+
>TupleMapperOld : Symbol(TupleMapperOld, Decl(inferRestArgumentsMappedTuple.ts, 2, 2))
37+
>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 10, 38))
38+
>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 10, 38))
39+
40+
const myPrimitiveTupleOld: [string, number] = extractPrimitivesOld({ primitive: "" }, { primitive: 0 });
41+
>myPrimitiveTupleOld : Symbol(myPrimitiveTupleOld, Decl(inferRestArgumentsMappedTuple.ts, 12, 5))
42+
>extractPrimitivesOld : Symbol(extractPrimitivesOld, Decl(inferRestArgumentsMappedTuple.ts, 8, 57))
43+
>primitive : Symbol(primitive, Decl(inferRestArgumentsMappedTuple.ts, 12, 68))
44+
>primitive : Symbol(primitive, Decl(inferRestArgumentsMappedTuple.ts, 12, 87))
45+
46+
type TupleMapperNew<Tuple extends any[]> = {
47+
>TupleMapperNew : Symbol(TupleMapperNew, Decl(inferRestArgumentsMappedTuple.ts, 12, 104))
48+
>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 14, 20))
49+
50+
[Key in keyof Tuple]: MyMappedType<Tuple[Key]>;
51+
>Key : Symbol(Key, Decl(inferRestArgumentsMappedTuple.ts, 15, 2))
52+
>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 14, 20))
53+
>MyMappedType : Symbol(MyMappedType, Decl(inferRestArgumentsMappedTuple.ts, 0, 0))
54+
>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 14, 20))
55+
>Key : Symbol(Key, Decl(inferRestArgumentsMappedTuple.ts, 15, 2))
56+
57+
};
58+
59+
type MyMappedTupleNew = TupleMapperNew<[string, number]>;
60+
>MyMappedTupleNew : Symbol(MyMappedTupleNew, Decl(inferRestArgumentsMappedTuple.ts, 16, 2))
61+
>TupleMapperNew : Symbol(TupleMapperNew, Decl(inferRestArgumentsMappedTuple.ts, 12, 104))
62+
63+
declare function extractPrimitivesNew<Tuple extends any[]>(...mappedTypes: TupleMapperNew<Tuple>): Tuple;
64+
>extractPrimitivesNew : Symbol(extractPrimitivesNew, Decl(inferRestArgumentsMappedTuple.ts, 18, 57))
65+
>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 20, 38))
66+
>mappedTypes : Symbol(mappedTypes, Decl(inferRestArgumentsMappedTuple.ts, 20, 59))
67+
>TupleMapperNew : Symbol(TupleMapperNew, Decl(inferRestArgumentsMappedTuple.ts, 12, 104))
68+
>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 20, 38))
69+
>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 20, 38))
70+
71+
const myPrimitiveTupleNew: [string, number] = extractPrimitivesNew({ primitive: "" }, { primitive: 0 });
72+
>myPrimitiveTupleNew : Symbol(myPrimitiveTupleNew, Decl(inferRestArgumentsMappedTuple.ts, 22, 5))
73+
>extractPrimitivesNew : Symbol(extractPrimitivesNew, Decl(inferRestArgumentsMappedTuple.ts, 18, 57))
74+
>primitive : Symbol(primitive, Decl(inferRestArgumentsMappedTuple.ts, 22, 68))
75+
>primitive : Symbol(primitive, Decl(inferRestArgumentsMappedTuple.ts, 22, 87))
76+
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
=== tests/cases/compiler/inferRestArgumentsMappedTuple.ts ===
2+
type MyMappedType<Primitive extends any> = {
3+
>MyMappedType : MyMappedType<Primitive>
4+
5+
primitive: Primitive;
6+
>primitive : Primitive
7+
8+
};
9+
10+
type TupleMapperOld<Tuple extends any[]> = {
11+
>TupleMapperOld : TupleMapperOld<Tuple>
12+
13+
[Key in keyof Tuple]: Tuple[Key] extends Tuple[number] ? MyMappedType<Tuple[Key]> : never;
14+
};
15+
16+
type MyMappedTupleOld = TupleMapperOld<[string, number]>; // [MyMappedType<string>, MyMappedType<number>]
17+
>MyMappedTupleOld : [MyMappedType<string>, MyMappedType<number>]
18+
19+
declare function extractPrimitivesOld<Tuple extends any[]>(...mappedTypes: TupleMapperOld<Tuple>): Tuple;
20+
>extractPrimitivesOld : <Tuple extends any[]>(...mappedTypes: TupleMapperOld<Tuple>) => Tuple
21+
>mappedTypes : TupleMapperOld<Tuple>
22+
23+
const myPrimitiveTupleOld: [string, number] = extractPrimitivesOld({ primitive: "" }, { primitive: 0 });
24+
>myPrimitiveTupleOld : [string, number]
25+
>extractPrimitivesOld({ primitive: "" }, { primitive: 0 }) : [string, number]
26+
>extractPrimitivesOld : <Tuple extends any[]>(...mappedTypes: TupleMapperOld<Tuple>) => Tuple
27+
>{ primitive: "" } : { primitive: string; }
28+
>primitive : string
29+
>"" : ""
30+
>{ primitive: 0 } : { primitive: number; }
31+
>primitive : number
32+
>0 : 0
33+
34+
type TupleMapperNew<Tuple extends any[]> = {
35+
>TupleMapperNew : TupleMapperNew<Tuple>
36+
37+
[Key in keyof Tuple]: MyMappedType<Tuple[Key]>;
38+
};
39+
40+
type MyMappedTupleNew = TupleMapperNew<[string, number]>;
41+
>MyMappedTupleNew : [MyMappedType<string>, MyMappedType<number>]
42+
43+
declare function extractPrimitivesNew<Tuple extends any[]>(...mappedTypes: TupleMapperNew<Tuple>): Tuple;
44+
>extractPrimitivesNew : <Tuple extends any[]>(...mappedTypes: TupleMapperNew<Tuple>) => Tuple
45+
>mappedTypes : TupleMapperNew<Tuple>
46+
47+
const myPrimitiveTupleNew: [string, number] = extractPrimitivesNew({ primitive: "" }, { primitive: 0 });
48+
>myPrimitiveTupleNew : [string, number]
49+
>extractPrimitivesNew({ primitive: "" }, { primitive: 0 }) : [string, number]
50+
>extractPrimitivesNew : <Tuple extends any[]>(...mappedTypes: TupleMapperNew<Tuple>) => Tuple
51+
>{ primitive: "" } : { primitive: string; }
52+
>primitive : string
53+
>"" : ""
54+
>{ primitive: 0 } : { primitive: number; }
55+
>primitive : number
56+
>0 : 0
57+
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// @strict: true
2+
3+
type MyMappedType<Primitive extends any> = {
4+
primitive: Primitive;
5+
};
6+
7+
type TupleMapperOld<Tuple extends any[]> = {
8+
[Key in keyof Tuple]: Tuple[Key] extends Tuple[number] ? MyMappedType<Tuple[Key]> : never;
9+
};
10+
11+
type MyMappedTupleOld = TupleMapperOld<[string, number]>; // [MyMappedType<string>, MyMappedType<number>]
12+
13+
declare function extractPrimitivesOld<Tuple extends any[]>(...mappedTypes: TupleMapperOld<Tuple>): Tuple;
14+
15+
const myPrimitiveTupleOld: [string, number] = extractPrimitivesOld({ primitive: "" }, { primitive: 0 });
16+
17+
type TupleMapperNew<Tuple extends any[]> = {
18+
[Key in keyof Tuple]: MyMappedType<Tuple[Key]>;
19+
};
20+
21+
type MyMappedTupleNew = TupleMapperNew<[string, number]>;
22+
23+
declare function extractPrimitivesNew<Tuple extends any[]>(...mappedTypes: TupleMapperNew<Tuple>): Tuple;
24+
25+
const myPrimitiveTupleNew: [string, number] = extractPrimitivesNew({ primitive: "" }, { primitive: 0 });

0 commit comments

Comments
 (0)
0