From 44887b01e02a6f16ee93410aa84e18115b21bdd2 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Sat, 18 Feb 2023 20:58:56 -0800 Subject: [PATCH 1/3] Add test --- .../inferRestArgumentsMappedTuple.errors.txt | 27 ++++++++++ .../inferRestArgumentsMappedTuple.js | 23 +++++++++ .../inferRestArgumentsMappedTuple.symbols | 49 +++++++++++++++++++ .../inferRestArgumentsMappedTuple.types | 37 ++++++++++++++ .../compiler/inferRestArgumentsMappedTuple.ts | 18 +++++++ 5 files changed, 154 insertions(+) create mode 100644 tests/baselines/reference/inferRestArgumentsMappedTuple.errors.txt create mode 100644 tests/baselines/reference/inferRestArgumentsMappedTuple.js create mode 100644 tests/baselines/reference/inferRestArgumentsMappedTuple.symbols create mode 100644 tests/baselines/reference/inferRestArgumentsMappedTuple.types create mode 100644 tests/cases/compiler/inferRestArgumentsMappedTuple.ts diff --git a/tests/baselines/reference/inferRestArgumentsMappedTuple.errors.txt b/tests/baselines/reference/inferRestArgumentsMappedTuple.errors.txt new file mode 100644 index 0000000000000..9eb0da05fb055 --- /dev/null +++ b/tests/baselines/reference/inferRestArgumentsMappedTuple.errors.txt @@ -0,0 +1,27 @@ +tests/cases/compiler/inferRestArgumentsMappedTuple.ts(16,7): error TS2322: Type '[unknown, unknown]' is not assignable to type '[string, number]'. + Type at position 0 in source is not compatible with type at position 0 in target. + Type 'unknown' is not assignable to type 'string'. + + +==== tests/cases/compiler/inferRestArgumentsMappedTuple.ts (1 errors) ==== + type MyMappedType = { + primitive: Primitive; + }; + + type TupleMapperOld = { + [Key in keyof Tuple]: Tuple[Key] extends Tuple[number] ? MyMappedType : never; + }; + + // [MyMappedType, MyMappedType] + type MyMappedTupleOld = TupleMapperOld<[string, number]>; + // ^? + + declare function extractPrimitivesOld(...mappedTypes: TupleMapperOld): Tuple; + + // [string, number] + const myPrimitiveTupleOld: [string, number] = extractPrimitivesOld({ primitive: "" }, { primitive: 0 }); + ~~~~~~~~~~~~~~~~~~~ +!!! error TS2322: Type '[unknown, unknown]' is not assignable to type '[string, number]'. +!!! error TS2322: Type at position 0 in source is not compatible with type at position 0 in target. +!!! error TS2322: Type 'unknown' is not assignable to type 'string'. + \ No newline at end of file diff --git a/tests/baselines/reference/inferRestArgumentsMappedTuple.js b/tests/baselines/reference/inferRestArgumentsMappedTuple.js new file mode 100644 index 0000000000000..6d0ae269b3934 --- /dev/null +++ b/tests/baselines/reference/inferRestArgumentsMappedTuple.js @@ -0,0 +1,23 @@ +//// [inferRestArgumentsMappedTuple.ts] +type MyMappedType = { + primitive: Primitive; +}; + +type TupleMapperOld = { + [Key in keyof Tuple]: Tuple[Key] extends Tuple[number] ? MyMappedType : never; +}; + +// [MyMappedType, MyMappedType] +type MyMappedTupleOld = TupleMapperOld<[string, number]>; +// ^? + +declare function extractPrimitivesOld(...mappedTypes: TupleMapperOld): Tuple; + +// [string, number] +const myPrimitiveTupleOld: [string, number] = extractPrimitivesOld({ primitive: "" }, { primitive: 0 }); + + +//// [inferRestArgumentsMappedTuple.js] +"use strict"; +// [string, number] +var myPrimitiveTupleOld = extractPrimitivesOld({ primitive: "" }, { primitive: 0 }); diff --git a/tests/baselines/reference/inferRestArgumentsMappedTuple.symbols b/tests/baselines/reference/inferRestArgumentsMappedTuple.symbols new file mode 100644 index 0000000000000..2e8547eeb845c --- /dev/null +++ b/tests/baselines/reference/inferRestArgumentsMappedTuple.symbols @@ -0,0 +1,49 @@ +=== 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)) + +}; + +// [MyMappedType, MyMappedType] +type MyMappedTupleOld = TupleMapperOld<[string, number]>; +>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, 9, 57)) +>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 12, 38)) +>mappedTypes : Symbol(mappedTypes, Decl(inferRestArgumentsMappedTuple.ts, 12, 59)) +>TupleMapperOld : Symbol(TupleMapperOld, Decl(inferRestArgumentsMappedTuple.ts, 2, 2)) +>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 12, 38)) +>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 12, 38)) + +// [string, number] +const myPrimitiveTupleOld: [string, number] = extractPrimitivesOld({ primitive: "" }, { primitive: 0 }); +>myPrimitiveTupleOld : Symbol(myPrimitiveTupleOld, Decl(inferRestArgumentsMappedTuple.ts, 15, 5)) +>extractPrimitivesOld : Symbol(extractPrimitivesOld, Decl(inferRestArgumentsMappedTuple.ts, 9, 57)) +>primitive : Symbol(primitive, Decl(inferRestArgumentsMappedTuple.ts, 15, 68)) +>primitive : Symbol(primitive, Decl(inferRestArgumentsMappedTuple.ts, 15, 87)) + diff --git a/tests/baselines/reference/inferRestArgumentsMappedTuple.types b/tests/baselines/reference/inferRestArgumentsMappedTuple.types new file mode 100644 index 0000000000000..395e7c0640363 --- /dev/null +++ b/tests/baselines/reference/inferRestArgumentsMappedTuple.types @@ -0,0 +1,37 @@ +=== 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; +}; + +// [MyMappedType, MyMappedType] +type MyMappedTupleOld = TupleMapperOld<[string, number]>; +>MyMappedTupleOld : [MyMappedType, MyMappedType] + +// ^? + +declare function extractPrimitivesOld(...mappedTypes: TupleMapperOld): Tuple; +>extractPrimitivesOld : (...mappedTypes: TupleMapperOld) => Tuple +>mappedTypes : TupleMapperOld + +// [string, number] +const myPrimitiveTupleOld: [string, number] = extractPrimitivesOld({ primitive: "" }, { primitive: 0 }); +>myPrimitiveTupleOld : [string, number] +>extractPrimitivesOld({ primitive: "" }, { primitive: 0 }) : [unknown, unknown] +>extractPrimitivesOld : (...mappedTypes: TupleMapperOld) => 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..884962e7d7e39 --- /dev/null +++ b/tests/cases/compiler/inferRestArgumentsMappedTuple.ts @@ -0,0 +1,18 @@ +// @strict: true + +type MyMappedType = { + primitive: Primitive; +}; + +type TupleMapperOld = { + [Key in keyof Tuple]: Tuple[Key] extends Tuple[number] ? MyMappedType : never; +}; + +// [MyMappedType, MyMappedType] +type MyMappedTupleOld = TupleMapperOld<[string, number]>; +// ^? + +declare function extractPrimitivesOld(...mappedTypes: TupleMapperOld): Tuple; + +// [string, number] +const myPrimitiveTupleOld: [string, number] = extractPrimitivesOld({ primitive: "" }, { primitive: 0 }); From 58ccfeeee50749fe4529f7a02aa2040495eaab16 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Sat, 18 Feb 2023 21:30:49 -0800 Subject: [PATCH 2/3] Handle multiple levesl of substitutions and indexed accesses in getActualTypeVariable --- src/compiler/checker.ts | 2 +- .../inferRestArgumentsMappedTuple.errors.txt | 27 ------------------- .../inferRestArgumentsMappedTuple.types | 2 +- 3 files changed, 2 insertions(+), 29 deletions(-) delete mode 100644 tests/baselines/reference/inferRestArgumentsMappedTuple.errors.txt 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.errors.txt b/tests/baselines/reference/inferRestArgumentsMappedTuple.errors.txt deleted file mode 100644 index 9eb0da05fb055..0000000000000 --- a/tests/baselines/reference/inferRestArgumentsMappedTuple.errors.txt +++ /dev/null @@ -1,27 +0,0 @@ -tests/cases/compiler/inferRestArgumentsMappedTuple.ts(16,7): error TS2322: Type '[unknown, unknown]' is not assignable to type '[string, number]'. - Type at position 0 in source is not compatible with type at position 0 in target. - Type 'unknown' is not assignable to type 'string'. - - -==== tests/cases/compiler/inferRestArgumentsMappedTuple.ts (1 errors) ==== - type MyMappedType = { - primitive: Primitive; - }; - - type TupleMapperOld = { - [Key in keyof Tuple]: Tuple[Key] extends Tuple[number] ? MyMappedType : never; - }; - - // [MyMappedType, MyMappedType] - type MyMappedTupleOld = TupleMapperOld<[string, number]>; - // ^? - - declare function extractPrimitivesOld(...mappedTypes: TupleMapperOld): Tuple; - - // [string, number] - const myPrimitiveTupleOld: [string, number] = extractPrimitivesOld({ primitive: "" }, { primitive: 0 }); - ~~~~~~~~~~~~~~~~~~~ -!!! error TS2322: Type '[unknown, unknown]' is not assignable to type '[string, number]'. -!!! error TS2322: Type at position 0 in source is not compatible with type at position 0 in target. -!!! error TS2322: Type 'unknown' is not assignable to type 'string'. - \ No newline at end of file diff --git a/tests/baselines/reference/inferRestArgumentsMappedTuple.types b/tests/baselines/reference/inferRestArgumentsMappedTuple.types index 395e7c0640363..9c281afa3a1d3 100644 --- a/tests/baselines/reference/inferRestArgumentsMappedTuple.types +++ b/tests/baselines/reference/inferRestArgumentsMappedTuple.types @@ -26,7 +26,7 @@ declare function extractPrimitivesOld(...mappedTypes: Tuple // [string, number] const myPrimitiveTupleOld: [string, number] = extractPrimitivesOld({ primitive: "" }, { primitive: 0 }); >myPrimitiveTupleOld : [string, number] ->extractPrimitivesOld({ primitive: "" }, { primitive: 0 }) : [unknown, unknown] +>extractPrimitivesOld({ primitive: "" }, { primitive: 0 }) : [string, number] >extractPrimitivesOld : (...mappedTypes: TupleMapperOld) => Tuple >{ primitive: "" } : { primitive: string; } >primitive : string From 54221fd349cc8d9319c26bb49af25b27c4bbf3b5 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Sat, 18 Feb 2023 21:51:19 -0800 Subject: [PATCH 3/3] Pull whole test from issue --- .../inferRestArgumentsMappedTuple.js | 17 ++++-- .../inferRestArgumentsMappedTuple.symbols | 55 ++++++++++++++----- .../inferRestArgumentsMappedTuple.types | 30 ++++++++-- .../compiler/inferRestArgumentsMappedTuple.ts | 15 +++-- 4 files changed, 89 insertions(+), 28 deletions(-) diff --git a/tests/baselines/reference/inferRestArgumentsMappedTuple.js b/tests/baselines/reference/inferRestArgumentsMappedTuple.js index 6d0ae269b3934..dec3b93df8ef7 100644 --- a/tests/baselines/reference/inferRestArgumentsMappedTuple.js +++ b/tests/baselines/reference/inferRestArgumentsMappedTuple.js @@ -7,17 +7,24 @@ type TupleMapperOld = { [Key in keyof Tuple]: Tuple[Key] extends Tuple[number] ? MyMappedType : never; }; -// [MyMappedType, MyMappedType] -type MyMappedTupleOld = TupleMapperOld<[string, number]>; -// ^? +type MyMappedTupleOld = TupleMapperOld<[string, number]>; // [MyMappedType, MyMappedType] declare function extractPrimitivesOld(...mappedTypes: TupleMapperOld): Tuple; -// [string, number] 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"; -// [string, number] 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 index 2e8547eeb845c..7a763a93e3f7f 100644 --- a/tests/baselines/reference/inferRestArgumentsMappedTuple.symbols +++ b/tests/baselines/reference/inferRestArgumentsMappedTuple.symbols @@ -25,25 +25,52 @@ type TupleMapperOld = { }; -// [MyMappedType, MyMappedType] -type MyMappedTupleOld = TupleMapperOld<[string, number]>; +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, 9, 57)) ->Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 12, 38)) ->mappedTypes : Symbol(mappedTypes, Decl(inferRestArgumentsMappedTuple.ts, 12, 59)) +>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, 12, 38)) ->Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 12, 38)) +>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 10, 38)) +>Tuple : Symbol(Tuple, Decl(inferRestArgumentsMappedTuple.ts, 10, 38)) -// [string, number] const myPrimitiveTupleOld: [string, number] = extractPrimitivesOld({ primitive: "" }, { primitive: 0 }); ->myPrimitiveTupleOld : Symbol(myPrimitiveTupleOld, Decl(inferRestArgumentsMappedTuple.ts, 15, 5)) ->extractPrimitivesOld : Symbol(extractPrimitivesOld, Decl(inferRestArgumentsMappedTuple.ts, 9, 57)) ->primitive : Symbol(primitive, Decl(inferRestArgumentsMappedTuple.ts, 15, 68)) ->primitive : Symbol(primitive, Decl(inferRestArgumentsMappedTuple.ts, 15, 87)) +>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 index 9c281afa3a1d3..eb8356ad91e17 100644 --- a/tests/baselines/reference/inferRestArgumentsMappedTuple.types +++ b/tests/baselines/reference/inferRestArgumentsMappedTuple.types @@ -13,17 +13,13 @@ type TupleMapperOld = { [Key in keyof Tuple]: Tuple[Key] extends Tuple[number] ? MyMappedType : never; }; -// [MyMappedType, MyMappedType] -type MyMappedTupleOld = TupleMapperOld<[string, number]>; +type MyMappedTupleOld = TupleMapperOld<[string, number]>; // [MyMappedType, MyMappedType] >MyMappedTupleOld : [MyMappedType, MyMappedType] -// ^? - declare function extractPrimitivesOld(...mappedTypes: TupleMapperOld): Tuple; >extractPrimitivesOld : (...mappedTypes: TupleMapperOld) => Tuple >mappedTypes : TupleMapperOld -// [string, number] const myPrimitiveTupleOld: [string, number] = extractPrimitivesOld({ primitive: "" }, { primitive: 0 }); >myPrimitiveTupleOld : [string, number] >extractPrimitivesOld({ primitive: "" }, { primitive: 0 }) : [string, number] @@ -35,3 +31,27 @@ const myPrimitiveTupleOld: [string, number] = extractPrimitivesOld({ primitive: >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 index 884962e7d7e39..472f54b32428a 100644 --- a/tests/cases/compiler/inferRestArgumentsMappedTuple.ts +++ b/tests/cases/compiler/inferRestArgumentsMappedTuple.ts @@ -8,11 +8,18 @@ type TupleMapperOld = { [Key in keyof Tuple]: Tuple[Key] extends Tuple[number] ? MyMappedType : never; }; -// [MyMappedType, MyMappedType] -type MyMappedTupleOld = TupleMapperOld<[string, number]>; -// ^? +type MyMappedTupleOld = TupleMapperOld<[string, number]>; // [MyMappedType, MyMappedType] declare function extractPrimitivesOld(...mappedTypes: TupleMapperOld): Tuple; -// [string, number] 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 });