diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 50cf05bad962d..2312d497c7c79 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -17624,7 +17624,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { function getActualTypeVariable(type: Type): Type { if (type.flags & TypeFlags.Substitution) { - return (type as SubstitutionType).baseType; + return getActualTypeVariable((type as SubstitutionType).baseType); } if (type.flags & TypeFlags.IndexedAccess && ( (type as IndexedAccessType).objectType.flags & TypeFlags.Substitution || diff --git a/tests/baselines/reference/inferRestArgumentsMappedTuple.js b/tests/baselines/reference/inferRestArgumentsMappedTuple.js new file mode 100644 index 0000000000000..dec3b93df8ef7 --- /dev/null +++ b/tests/baselines/reference/inferRestArgumentsMappedTuple.js @@ -0,0 +1,30 @@ +//// [inferRestArgumentsMappedTuple.ts] +type MyMappedType = { + primitive: Primitive; +}; + +type TupleMapperOld = { + [Key in keyof Tuple]: Tuple[Key] extends Tuple[number] ? MyMappedType : never; +}; + +type MyMappedTupleOld = TupleMapperOld<[string, number]>; // [MyMappedType, MyMappedType] + +declare function extractPrimitivesOld(...mappedTypes: TupleMapperOld): Tuple; + +const myPrimitiveTupleOld: [string, number] = extractPrimitivesOld({ primitive: "" }, { primitive: 0 }); + +type TupleMapperNew = { + [Key in keyof Tuple]: MyMappedType; +}; + +type MyMappedTupleNew = TupleMapperNew<[string, number]>; + +declare function extractPrimitivesNew(...mappedTypes: TupleMapperNew): Tuple; + +const myPrimitiveTupleNew: [string, number] = extractPrimitivesNew({ primitive: "" }, { primitive: 0 }); + + +//// [inferRestArgumentsMappedTuple.js] +"use strict"; +var myPrimitiveTupleOld = extractPrimitivesOld({ primitive: "" }, { primitive: 0 }); +var myPrimitiveTupleNew = extractPrimitivesNew({ primitive: "" }, { primitive: 0 }); diff --git a/tests/baselines/reference/inferRestArgumentsMappedTuple.symbols b/tests/baselines/reference/inferRestArgumentsMappedTuple.symbols new file mode 100644 index 0000000000000..7a763a93e3f7f --- /dev/null +++ b/tests/baselines/reference/inferRestArgumentsMappedTuple.symbols @@ -0,0 +1,76 @@ +=== tests/cases/compiler/inferRestArgumentsMappedTuple.ts === +type MyMappedType = { +>MyMappedType : Symbol(MyMappedType, Decl(inferRestArgumentsMappedTuple.ts, 0, 0)) +>Primitive : Symbol(Primitive, Decl(inferRestArgumentsMappedTuple.ts, 0, 18)) + + primitive: Primitive; +>primitive : Symbol(primitive, Decl(inferRestArgumentsMappedTuple.ts, 0, 44)) +>Primitive : Symbol(Primitive, Decl(inferRestArgumentsMappedTuple.ts, 0, 18)) + +}; + +type TupleMapperOld = { +>TupleMapperOld : Symbol(TupleMapperOld, Decl(inferRestArgumentsMappedTuple.ts, 2, 2)) +>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 4, 20)) + + [Key in keyof Tuple]: Tuple[Key] extends Tuple[number] ? MyMappedType : never; +>Key : Symbol(Key, Decl(inferRestArgumentsMappedTuple.ts, 5, 2)) +>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 4, 20)) +>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 4, 20)) +>Key : Symbol(Key, Decl(inferRestArgumentsMappedTuple.ts, 5, 2)) +>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 4, 20)) +>MyMappedType : Symbol(MyMappedType, Decl(inferRestArgumentsMappedTuple.ts, 0, 0)) +>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 4, 20)) +>Key : Symbol(Key, Decl(inferRestArgumentsMappedTuple.ts, 5, 2)) + +}; + +type MyMappedTupleOld = TupleMapperOld<[string, number]>; // [MyMappedType, MyMappedType] +>MyMappedTupleOld : Symbol(MyMappedTupleOld, Decl(inferRestArgumentsMappedTuple.ts, 6, 2)) +>TupleMapperOld : Symbol(TupleMapperOld, Decl(inferRestArgumentsMappedTuple.ts, 2, 2)) + +declare function extractPrimitivesOld(...mappedTypes: TupleMapperOld): Tuple; +>extractPrimitivesOld : Symbol(extractPrimitivesOld, Decl(inferRestArgumentsMappedTuple.ts, 8, 57)) +>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 10, 38)) +>mappedTypes : Symbol(mappedTypes, Decl(inferRestArgumentsMappedTuple.ts, 10, 59)) +>TupleMapperOld : Symbol(TupleMapperOld, Decl(inferRestArgumentsMappedTuple.ts, 2, 2)) +>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 10, 38)) +>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 10, 38)) + +const myPrimitiveTupleOld: [string, number] = extractPrimitivesOld({ primitive: "" }, { primitive: 0 }); +>myPrimitiveTupleOld : Symbol(myPrimitiveTupleOld, Decl(inferRestArgumentsMappedTuple.ts, 12, 5)) +>extractPrimitivesOld : Symbol(extractPrimitivesOld, Decl(inferRestArgumentsMappedTuple.ts, 8, 57)) +>primitive : Symbol(primitive, Decl(inferRestArgumentsMappedTuple.ts, 12, 68)) +>primitive : Symbol(primitive, Decl(inferRestArgumentsMappedTuple.ts, 12, 87)) + +type TupleMapperNew = { +>TupleMapperNew : Symbol(TupleMapperNew, Decl(inferRestArgumentsMappedTuple.ts, 12, 104)) +>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 14, 20)) + + [Key in keyof Tuple]: MyMappedType; +>Key : Symbol(Key, Decl(inferRestArgumentsMappedTuple.ts, 15, 2)) +>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 14, 20)) +>MyMappedType : Symbol(MyMappedType, Decl(inferRestArgumentsMappedTuple.ts, 0, 0)) +>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 14, 20)) +>Key : Symbol(Key, Decl(inferRestArgumentsMappedTuple.ts, 15, 2)) + +}; + +type MyMappedTupleNew = TupleMapperNew<[string, number]>; +>MyMappedTupleNew : Symbol(MyMappedTupleNew, Decl(inferRestArgumentsMappedTuple.ts, 16, 2)) +>TupleMapperNew : Symbol(TupleMapperNew, Decl(inferRestArgumentsMappedTuple.ts, 12, 104)) + +declare function extractPrimitivesNew(...mappedTypes: TupleMapperNew): Tuple; +>extractPrimitivesNew : Symbol(extractPrimitivesNew, Decl(inferRestArgumentsMappedTuple.ts, 18, 57)) +>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 20, 38)) +>mappedTypes : Symbol(mappedTypes, Decl(inferRestArgumentsMappedTuple.ts, 20, 59)) +>TupleMapperNew : Symbol(TupleMapperNew, Decl(inferRestArgumentsMappedTuple.ts, 12, 104)) +>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 20, 38)) +>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 20, 38)) + +const myPrimitiveTupleNew: [string, number] = extractPrimitivesNew({ primitive: "" }, { primitive: 0 }); +>myPrimitiveTupleNew : Symbol(myPrimitiveTupleNew, Decl(inferRestArgumentsMappedTuple.ts, 22, 5)) +>extractPrimitivesNew : Symbol(extractPrimitivesNew, Decl(inferRestArgumentsMappedTuple.ts, 18, 57)) +>primitive : Symbol(primitive, Decl(inferRestArgumentsMappedTuple.ts, 22, 68)) +>primitive : Symbol(primitive, Decl(inferRestArgumentsMappedTuple.ts, 22, 87)) + diff --git a/tests/baselines/reference/inferRestArgumentsMappedTuple.types b/tests/baselines/reference/inferRestArgumentsMappedTuple.types new file mode 100644 index 0000000000000..eb8356ad91e17 --- /dev/null +++ b/tests/baselines/reference/inferRestArgumentsMappedTuple.types @@ -0,0 +1,57 @@ +=== tests/cases/compiler/inferRestArgumentsMappedTuple.ts === +type MyMappedType = { +>MyMappedType : MyMappedType + + primitive: Primitive; +>primitive : Primitive + +}; + +type TupleMapperOld = { +>TupleMapperOld : TupleMapperOld + + [Key in keyof Tuple]: Tuple[Key] extends Tuple[number] ? MyMappedType : never; +}; + +type MyMappedTupleOld = TupleMapperOld<[string, number]>; // [MyMappedType, MyMappedType] +>MyMappedTupleOld : [MyMappedType, MyMappedType] + +declare function extractPrimitivesOld(...mappedTypes: TupleMapperOld): Tuple; +>extractPrimitivesOld : (...mappedTypes: TupleMapperOld) => Tuple +>mappedTypes : TupleMapperOld + +const myPrimitiveTupleOld: [string, number] = extractPrimitivesOld({ primitive: "" }, { primitive: 0 }); +>myPrimitiveTupleOld : [string, number] +>extractPrimitivesOld({ primitive: "" }, { primitive: 0 }) : [string, number] +>extractPrimitivesOld : (...mappedTypes: TupleMapperOld) => Tuple +>{ primitive: "" } : { primitive: string; } +>primitive : string +>"" : "" +>{ primitive: 0 } : { primitive: number; } +>primitive : number +>0 : 0 + +type TupleMapperNew = { +>TupleMapperNew : TupleMapperNew + + [Key in keyof Tuple]: MyMappedType; +}; + +type MyMappedTupleNew = TupleMapperNew<[string, number]>; +>MyMappedTupleNew : [MyMappedType, MyMappedType] + +declare function extractPrimitivesNew(...mappedTypes: TupleMapperNew): Tuple; +>extractPrimitivesNew : (...mappedTypes: TupleMapperNew) => Tuple +>mappedTypes : TupleMapperNew + +const myPrimitiveTupleNew: [string, number] = extractPrimitivesNew({ primitive: "" }, { primitive: 0 }); +>myPrimitiveTupleNew : [string, number] +>extractPrimitivesNew({ primitive: "" }, { primitive: 0 }) : [string, number] +>extractPrimitivesNew : (...mappedTypes: TupleMapperNew) => Tuple +>{ primitive: "" } : { primitive: string; } +>primitive : string +>"" : "" +>{ primitive: 0 } : { primitive: number; } +>primitive : number +>0 : 0 + diff --git a/tests/cases/compiler/inferRestArgumentsMappedTuple.ts b/tests/cases/compiler/inferRestArgumentsMappedTuple.ts new file mode 100644 index 0000000000000..472f54b32428a --- /dev/null +++ b/tests/cases/compiler/inferRestArgumentsMappedTuple.ts @@ -0,0 +1,25 @@ +// @strict: true + +type MyMappedType = { + primitive: Primitive; +}; + +type TupleMapperOld = { + [Key in keyof Tuple]: Tuple[Key] extends Tuple[number] ? MyMappedType : never; +}; + +type MyMappedTupleOld = TupleMapperOld<[string, number]>; // [MyMappedType, MyMappedType] + +declare function extractPrimitivesOld(...mappedTypes: TupleMapperOld): Tuple; + +const myPrimitiveTupleOld: [string, number] = extractPrimitivesOld({ primitive: "" }, { primitive: 0 }); + +type TupleMapperNew = { + [Key in keyof Tuple]: MyMappedType; +}; + +type MyMappedTupleNew = TupleMapperNew<[string, number]>; + +declare function extractPrimitivesNew(...mappedTypes: TupleMapperNew): Tuple; + +const myPrimitiveTupleNew: [string, number] = extractPrimitivesNew({ primitive: "" }, { primitive: 0 });