diff --git a/tests/baselines/reference/keyofAndIndexedAccess2.errors.txt b/tests/baselines/reference/keyofAndIndexedAccess2.errors.txt index 6e1b87a72e3..aef57c129a3 100644 --- a/tests/baselines/reference/keyofAndIndexedAccess2.errors.txt +++ b/tests/baselines/reference/keyofAndIndexedAccess2.errors.txt @@ -187,4 +187,11 @@ tests/cases/conformance/types/keyof/keyofAndIndexedAccess2.ts(108,5): error TS23 !!! error TS2322: Type '123' is not assignable to type '123 & "some string"'. !!! error TS2322: Type '123' is not assignable to type '"some string"'. } + + // Repro from #30920 + + type StrictExtract = T extends U ? U extends T ? T : never : never; + type StrictExclude = T extends StrictExtract ? never : T; + type A = { [Q in { [P in keyof T]: P; }[keyof T]]: T[Q]; }; + type B = A<{ [Q in keyof T]: StrictExclude, {}>; }>; \ No newline at end of file diff --git a/tests/baselines/reference/keyofAndIndexedAccess2.js b/tests/baselines/reference/keyofAndIndexedAccess2.js index 8dad708c298..1788c40563c 100644 --- a/tests/baselines/reference/keyofAndIndexedAccess2.js +++ b/tests/baselines/reference/keyofAndIndexedAccess2.js @@ -108,6 +108,13 @@ interface Type { function get123(): Type[K] { return 123; // Error } + +// Repro from #30920 + +type StrictExtract = T extends U ? U extends T ? T : never : never; +type StrictExclude = T extends StrictExtract ? never : T; +type A = { [Q in { [P in keyof T]: P; }[keyof T]]: T[Q]; }; +type B = A<{ [Q in keyof T]: StrictExclude, {}>; }>; //// [keyofAndIndexedAccess2.js] diff --git a/tests/baselines/reference/keyofAndIndexedAccess2.symbols b/tests/baselines/reference/keyofAndIndexedAccess2.symbols index 803700efa37..abbe38fd5c9 100644 --- a/tests/baselines/reference/keyofAndIndexedAccess2.symbols +++ b/tests/baselines/reference/keyofAndIndexedAccess2.symbols @@ -388,3 +388,49 @@ function get123(): Type[K] { return 123; // Error } +// Repro from #30920 + +type StrictExtract = T extends U ? U extends T ? T : never : never; +>StrictExtract : Symbol(StrictExtract, Decl(keyofAndIndexedAccess2.ts, 108, 1)) +>T : Symbol(T, Decl(keyofAndIndexedAccess2.ts, 112, 19)) +>U : Symbol(U, Decl(keyofAndIndexedAccess2.ts, 112, 21)) +>T : Symbol(T, Decl(keyofAndIndexedAccess2.ts, 112, 19)) +>U : Symbol(U, Decl(keyofAndIndexedAccess2.ts, 112, 21)) +>U : Symbol(U, Decl(keyofAndIndexedAccess2.ts, 112, 21)) +>T : Symbol(T, Decl(keyofAndIndexedAccess2.ts, 112, 19)) +>T : Symbol(T, Decl(keyofAndIndexedAccess2.ts, 112, 19)) + +type StrictExclude = T extends StrictExtract ? never : T; +>StrictExclude : Symbol(StrictExclude, Decl(keyofAndIndexedAccess2.ts, 112, 73)) +>T : Symbol(T, Decl(keyofAndIndexedAccess2.ts, 113, 19)) +>U : Symbol(U, Decl(keyofAndIndexedAccess2.ts, 113, 21)) +>T : Symbol(T, Decl(keyofAndIndexedAccess2.ts, 113, 19)) +>StrictExtract : Symbol(StrictExtract, Decl(keyofAndIndexedAccess2.ts, 108, 1)) +>T : Symbol(T, Decl(keyofAndIndexedAccess2.ts, 113, 19)) +>U : Symbol(U, Decl(keyofAndIndexedAccess2.ts, 113, 21)) +>T : Symbol(T, Decl(keyofAndIndexedAccess2.ts, 113, 19)) + +type A = { [Q in { [P in keyof T]: P; }[keyof T]]: T[Q]; }; +>A : Symbol(A, Decl(keyofAndIndexedAccess2.ts, 113, 69)) +>T : Symbol(T, Decl(keyofAndIndexedAccess2.ts, 114, 7)) +>Q : Symbol(Q, Decl(keyofAndIndexedAccess2.ts, 114, 15)) +>P : Symbol(P, Decl(keyofAndIndexedAccess2.ts, 114, 23)) +>T : Symbol(T, Decl(keyofAndIndexedAccess2.ts, 114, 7)) +>P : Symbol(P, Decl(keyofAndIndexedAccess2.ts, 114, 23)) +>T : Symbol(T, Decl(keyofAndIndexedAccess2.ts, 114, 7)) +>T : Symbol(T, Decl(keyofAndIndexedAccess2.ts, 114, 7)) +>Q : Symbol(Q, Decl(keyofAndIndexedAccess2.ts, 114, 15)) + +type B = A<{ [Q in keyof T]: StrictExclude, {}>; }>; +>B : Symbol(B, Decl(keyofAndIndexedAccess2.ts, 114, 62)) +>T : Symbol(T, Decl(keyofAndIndexedAccess2.ts, 115, 7)) +>V : Symbol(V, Decl(keyofAndIndexedAccess2.ts, 115, 9)) +>A : Symbol(A, Decl(keyofAndIndexedAccess2.ts, 113, 69)) +>Q : Symbol(Q, Decl(keyofAndIndexedAccess2.ts, 115, 20)) +>T : Symbol(T, Decl(keyofAndIndexedAccess2.ts, 115, 7)) +>StrictExclude : Symbol(StrictExclude, Decl(keyofAndIndexedAccess2.ts, 112, 73)) +>B : Symbol(B, Decl(keyofAndIndexedAccess2.ts, 114, 62)) +>T : Symbol(T, Decl(keyofAndIndexedAccess2.ts, 115, 7)) +>Q : Symbol(Q, Decl(keyofAndIndexedAccess2.ts, 115, 20)) +>V : Symbol(V, Decl(keyofAndIndexedAccess2.ts, 115, 9)) + diff --git a/tests/baselines/reference/keyofAndIndexedAccess2.types b/tests/baselines/reference/keyofAndIndexedAccess2.types index 5f5b80a4819..4eccf23a804 100644 --- a/tests/baselines/reference/keyofAndIndexedAccess2.types +++ b/tests/baselines/reference/keyofAndIndexedAccess2.types @@ -423,3 +423,17 @@ function get123(): Type[K] { >123 : 123 } +// Repro from #30920 + +type StrictExtract = T extends U ? U extends T ? T : never : never; +>StrictExtract : StrictExtract + +type StrictExclude = T extends StrictExtract ? never : T; +>StrictExclude : StrictExclude + +type A = { [Q in { [P in keyof T]: P; }[keyof T]]: T[Q]; }; +>A : A + +type B = A<{ [Q in keyof T]: StrictExclude, {}>; }>; +>B : A<{ [Q in keyof T]: StrictExclude, {}>; }>, {}>; }>, {}>; }>, {}>; }>, {}>; }>, {}>; }>, {}>; }>, {}>; }>, {}>; }>, {}>; }>, {}>; }> +