TypeScript/tests/baselines/reference/recursiveConditionalTypes.symbols
Kagami Sascha Rosylight ae582a22ee
Add target: "es2022" (#46291)
* Add `target: "es2022"`

* Add Object.hasOwn

* formatToParts is es2018

* ref update

* optional parameter

* Revert "optional parameter"

This reverts commit e67d6e5f60.

* undefined

* error cause

* Lint fix

Co-authored-by: Orta <git@orta.io>
2021-11-04 10:55:11 -07:00

631 lines
31 KiB
Plaintext

=== tests/cases/compiler/recursiveConditionalTypes.ts ===
// Awaiting promises
type __Awaited<T> =
>__Awaited : Symbol(__Awaited, Decl(recursiveConditionalTypes.ts, 0, 0))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 2, 15))
T extends null | undefined ? T :
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 2, 15))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 2, 15))
T extends PromiseLike<infer U> ? __Awaited<U> :
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 2, 15))
>PromiseLike : Symbol(PromiseLike, Decl(lib.es5.d.ts, --, --))
>U : Symbol(U, Decl(recursiveConditionalTypes.ts, 4, 31))
>__Awaited : Symbol(__Awaited, Decl(recursiveConditionalTypes.ts, 0, 0))
>U : Symbol(U, Decl(recursiveConditionalTypes.ts, 4, 31))
T;
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 2, 15))
type MyPromise<T> = {
>MyPromise : Symbol(MyPromise, Decl(recursiveConditionalTypes.ts, 5, 6))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 7, 15))
then<U>(f: ((value: T) => U | PromiseLike<U>) | null | undefined): MyPromise<U>;
>then : Symbol(then, Decl(recursiveConditionalTypes.ts, 7, 21))
>U : Symbol(U, Decl(recursiveConditionalTypes.ts, 8, 9))
>f : Symbol(f, Decl(recursiveConditionalTypes.ts, 8, 12))
>value : Symbol(value, Decl(recursiveConditionalTypes.ts, 8, 17))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 7, 15))
>U : Symbol(U, Decl(recursiveConditionalTypes.ts, 8, 9))
>PromiseLike : Symbol(PromiseLike, Decl(lib.es5.d.ts, --, --))
>U : Symbol(U, Decl(recursiveConditionalTypes.ts, 8, 9))
>MyPromise : Symbol(MyPromise, Decl(recursiveConditionalTypes.ts, 5, 6))
>U : Symbol(U, Decl(recursiveConditionalTypes.ts, 8, 9))
}
type InfinitePromise<T> = Promise<InfinitePromise<T>>;
>InfinitePromise : Symbol(InfinitePromise, Decl(recursiveConditionalTypes.ts, 9, 1))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 11, 21))
>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2018.promise.d.ts, --, --))
>InfinitePromise : Symbol(InfinitePromise, Decl(recursiveConditionalTypes.ts, 9, 1))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 11, 21))
type P0 = __Awaited<Promise<string | Promise<MyPromise<number> | null> | undefined>>;
>P0 : Symbol(P0, Decl(recursiveConditionalTypes.ts, 11, 54))
>__Awaited : Symbol(__Awaited, Decl(recursiveConditionalTypes.ts, 0, 0))
>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2018.promise.d.ts, --, --))
>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2018.promise.d.ts, --, --))
>MyPromise : Symbol(MyPromise, Decl(recursiveConditionalTypes.ts, 5, 6))
type P1 = __Awaited<any>;
>P1 : Symbol(P1, Decl(recursiveConditionalTypes.ts, 13, 85))
>__Awaited : Symbol(__Awaited, Decl(recursiveConditionalTypes.ts, 0, 0))
type P2 = __Awaited<InfinitePromise<number>>; // Error
>P2 : Symbol(P2, Decl(recursiveConditionalTypes.ts, 14, 25))
>__Awaited : Symbol(__Awaited, Decl(recursiveConditionalTypes.ts, 0, 0))
>InfinitePromise : Symbol(InfinitePromise, Decl(recursiveConditionalTypes.ts, 9, 1))
function f11<T, U extends T>(tx: T, ta: __Awaited<T>, ux: U, ua: __Awaited<U>) {
>f11 : Symbol(f11, Decl(recursiveConditionalTypes.ts, 15, 45))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 17, 13))
>U : Symbol(U, Decl(recursiveConditionalTypes.ts, 17, 15))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 17, 13))
>tx : Symbol(tx, Decl(recursiveConditionalTypes.ts, 17, 29))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 17, 13))
>ta : Symbol(ta, Decl(recursiveConditionalTypes.ts, 17, 35))
>__Awaited : Symbol(__Awaited, Decl(recursiveConditionalTypes.ts, 0, 0))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 17, 13))
>ux : Symbol(ux, Decl(recursiveConditionalTypes.ts, 17, 53))
>U : Symbol(U, Decl(recursiveConditionalTypes.ts, 17, 15))
>ua : Symbol(ua, Decl(recursiveConditionalTypes.ts, 17, 60))
>__Awaited : Symbol(__Awaited, Decl(recursiveConditionalTypes.ts, 0, 0))
>U : Symbol(U, Decl(recursiveConditionalTypes.ts, 17, 15))
ta = ua;
>ta : Symbol(ta, Decl(recursiveConditionalTypes.ts, 17, 35))
>ua : Symbol(ua, Decl(recursiveConditionalTypes.ts, 17, 60))
ua = ta; // Error
>ua : Symbol(ua, Decl(recursiveConditionalTypes.ts, 17, 60))
>ta : Symbol(ta, Decl(recursiveConditionalTypes.ts, 17, 35))
ta = tx; // Error
>ta : Symbol(ta, Decl(recursiveConditionalTypes.ts, 17, 35))
>tx : Symbol(tx, Decl(recursiveConditionalTypes.ts, 17, 29))
tx = ta; // Error
>tx : Symbol(tx, Decl(recursiveConditionalTypes.ts, 17, 29))
>ta : Symbol(ta, Decl(recursiveConditionalTypes.ts, 17, 35))
}
// Flattening arrays
type Flatten<T extends readonly unknown[]> = T extends unknown[] ? _Flatten<T>[] : readonly _Flatten<T>[];
>Flatten : Symbol(Flatten, Decl(recursiveConditionalTypes.ts, 22, 1))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 26, 13))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 26, 13))
>_Flatten : Symbol(_Flatten, Decl(recursiveConditionalTypes.ts, 26, 106))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 26, 13))
>_Flatten : Symbol(_Flatten, Decl(recursiveConditionalTypes.ts, 26, 106))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 26, 13))
type _Flatten<T> = T extends readonly (infer U)[] ? _Flatten<U> : T;
>_Flatten : Symbol(_Flatten, Decl(recursiveConditionalTypes.ts, 26, 106))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 27, 14))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 27, 14))
>U : Symbol(U, Decl(recursiveConditionalTypes.ts, 27, 44))
>_Flatten : Symbol(_Flatten, Decl(recursiveConditionalTypes.ts, 26, 106))
>U : Symbol(U, Decl(recursiveConditionalTypes.ts, 27, 44))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 27, 14))
type InfiniteArray<T> = InfiniteArray<T>[];
>InfiniteArray : Symbol(InfiniteArray, Decl(recursiveConditionalTypes.ts, 27, 68))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 29, 19))
>InfiniteArray : Symbol(InfiniteArray, Decl(recursiveConditionalTypes.ts, 27, 68))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 29, 19))
type B0 = Flatten<string[][][]>;
>B0 : Symbol(B0, Decl(recursiveConditionalTypes.ts, 29, 43))
>Flatten : Symbol(Flatten, Decl(recursiveConditionalTypes.ts, 22, 1))
type B1 = Flatten<string[][] | readonly (number[] | boolean[][])[]>;
>B1 : Symbol(B1, Decl(recursiveConditionalTypes.ts, 31, 32))
>Flatten : Symbol(Flatten, Decl(recursiveConditionalTypes.ts, 22, 1))
type B2 = Flatten<InfiniteArray<string>>;
>B2 : Symbol(B2, Decl(recursiveConditionalTypes.ts, 32, 68))
>Flatten : Symbol(Flatten, Decl(recursiveConditionalTypes.ts, 22, 1))
>InfiniteArray : Symbol(InfiniteArray, Decl(recursiveConditionalTypes.ts, 27, 68))
type B3 = B2[0]; // Error
>B3 : Symbol(B3, Decl(recursiveConditionalTypes.ts, 33, 41))
>B2 : Symbol(B2, Decl(recursiveConditionalTypes.ts, 32, 68))
// Repeating tuples
type TupleOf<T, N extends number> = N extends N ? number extends N ? T[] : _TupleOf<T, N, []> : never;
>TupleOf : Symbol(TupleOf, Decl(recursiveConditionalTypes.ts, 34, 16))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 38, 13))
>N : Symbol(N, Decl(recursiveConditionalTypes.ts, 38, 15))
>N : Symbol(N, Decl(recursiveConditionalTypes.ts, 38, 15))
>N : Symbol(N, Decl(recursiveConditionalTypes.ts, 38, 15))
>N : Symbol(N, Decl(recursiveConditionalTypes.ts, 38, 15))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 38, 13))
>_TupleOf : Symbol(_TupleOf, Decl(recursiveConditionalTypes.ts, 38, 102))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 38, 13))
>N : Symbol(N, Decl(recursiveConditionalTypes.ts, 38, 15))
type _TupleOf<T, N extends number, R extends unknown[]> = R['length'] extends N ? R : _TupleOf<T, N, [T, ...R]>;
>_TupleOf : Symbol(_TupleOf, Decl(recursiveConditionalTypes.ts, 38, 102))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 39, 14))
>N : Symbol(N, Decl(recursiveConditionalTypes.ts, 39, 16))
>R : Symbol(R, Decl(recursiveConditionalTypes.ts, 39, 34))
>R : Symbol(R, Decl(recursiveConditionalTypes.ts, 39, 34))
>N : Symbol(N, Decl(recursiveConditionalTypes.ts, 39, 16))
>R : Symbol(R, Decl(recursiveConditionalTypes.ts, 39, 34))
>_TupleOf : Symbol(_TupleOf, Decl(recursiveConditionalTypes.ts, 38, 102))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 39, 14))
>N : Symbol(N, Decl(recursiveConditionalTypes.ts, 39, 16))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 39, 14))
>R : Symbol(R, Decl(recursiveConditionalTypes.ts, 39, 34))
type TT0 = TupleOf<string, 4>;
>TT0 : Symbol(TT0, Decl(recursiveConditionalTypes.ts, 39, 112))
>TupleOf : Symbol(TupleOf, Decl(recursiveConditionalTypes.ts, 34, 16))
type TT1 = TupleOf<number, 0 | 2 | 4>;
>TT1 : Symbol(TT1, Decl(recursiveConditionalTypes.ts, 41, 30))
>TupleOf : Symbol(TupleOf, Decl(recursiveConditionalTypes.ts, 34, 16))
type TT2 = TupleOf<number, number>;
>TT2 : Symbol(TT2, Decl(recursiveConditionalTypes.ts, 42, 38))
>TupleOf : Symbol(TupleOf, Decl(recursiveConditionalTypes.ts, 34, 16))
type TT3 = TupleOf<number, any>;
>TT3 : Symbol(TT3, Decl(recursiveConditionalTypes.ts, 43, 35))
>TupleOf : Symbol(TupleOf, Decl(recursiveConditionalTypes.ts, 34, 16))
type TT4 = TupleOf<number, 100>;
>TT4 : Symbol(TT4, Decl(recursiveConditionalTypes.ts, 44, 32))
>TupleOf : Symbol(TupleOf, Decl(recursiveConditionalTypes.ts, 34, 16))
type TT5 = TupleOf<number, 1000>; // Depth error
>TT5 : Symbol(TT5, Decl(recursiveConditionalTypes.ts, 45, 32))
>TupleOf : Symbol(TupleOf, Decl(recursiveConditionalTypes.ts, 34, 16))
function f22<N extends number, M extends N>(tn: TupleOf<number, N>, tm: TupleOf<number, M>) {
>f22 : Symbol(f22, Decl(recursiveConditionalTypes.ts, 46, 33))
>N : Symbol(N, Decl(recursiveConditionalTypes.ts, 48, 13))
>M : Symbol(M, Decl(recursiveConditionalTypes.ts, 48, 30))
>N : Symbol(N, Decl(recursiveConditionalTypes.ts, 48, 13))
>tn : Symbol(tn, Decl(recursiveConditionalTypes.ts, 48, 44))
>TupleOf : Symbol(TupleOf, Decl(recursiveConditionalTypes.ts, 34, 16))
>N : Symbol(N, Decl(recursiveConditionalTypes.ts, 48, 13))
>tm : Symbol(tm, Decl(recursiveConditionalTypes.ts, 48, 67))
>TupleOf : Symbol(TupleOf, Decl(recursiveConditionalTypes.ts, 34, 16))
>M : Symbol(M, Decl(recursiveConditionalTypes.ts, 48, 30))
tn = tm;
>tn : Symbol(tn, Decl(recursiveConditionalTypes.ts, 48, 44))
>tm : Symbol(tm, Decl(recursiveConditionalTypes.ts, 48, 67))
tm = tn;
>tm : Symbol(tm, Decl(recursiveConditionalTypes.ts, 48, 67))
>tn : Symbol(tn, Decl(recursiveConditionalTypes.ts, 48, 44))
}
declare function f23<T>(t: TupleOf<T, 3>): T;
>f23 : Symbol(f23, Decl(recursiveConditionalTypes.ts, 51, 1))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 53, 21))
>t : Symbol(t, Decl(recursiveConditionalTypes.ts, 53, 24))
>TupleOf : Symbol(TupleOf, Decl(recursiveConditionalTypes.ts, 34, 16))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 53, 21))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 53, 21))
f23(['a', 'b', 'c']); // string
>f23 : Symbol(f23, Decl(recursiveConditionalTypes.ts, 51, 1))
// Inference to recursive type
interface Box<T> { value: T };
>Box : Symbol(Box, Decl(recursiveConditionalTypes.ts, 55, 21))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 59, 14))
>value : Symbol(Box.value, Decl(recursiveConditionalTypes.ts, 59, 18))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 59, 14))
type RecBox<T> = T | Box<RecBox<T>>;
>RecBox : Symbol(RecBox, Decl(recursiveConditionalTypes.ts, 59, 30))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 60, 12))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 60, 12))
>Box : Symbol(Box, Decl(recursiveConditionalTypes.ts, 55, 21))
>RecBox : Symbol(RecBox, Decl(recursiveConditionalTypes.ts, 59, 30))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 60, 12))
type InfBox<T> = Box<InfBox<T>>;
>InfBox : Symbol(InfBox, Decl(recursiveConditionalTypes.ts, 60, 36))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 61, 12))
>Box : Symbol(Box, Decl(recursiveConditionalTypes.ts, 55, 21))
>InfBox : Symbol(InfBox, Decl(recursiveConditionalTypes.ts, 60, 36))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 61, 12))
declare function unbox<T>(box: RecBox<T>): T
>unbox : Symbol(unbox, Decl(recursiveConditionalTypes.ts, 61, 32))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 63, 23))
>box : Symbol(box, Decl(recursiveConditionalTypes.ts, 63, 26))
>RecBox : Symbol(RecBox, Decl(recursiveConditionalTypes.ts, 59, 30))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 63, 23))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 63, 23))
type T1 = Box<string>;
>T1 : Symbol(T1, Decl(recursiveConditionalTypes.ts, 63, 44))
>Box : Symbol(Box, Decl(recursiveConditionalTypes.ts, 55, 21))
type T2 = Box<T1>;
>T2 : Symbol(T2, Decl(recursiveConditionalTypes.ts, 65, 22))
>Box : Symbol(Box, Decl(recursiveConditionalTypes.ts, 55, 21))
>T1 : Symbol(T1, Decl(recursiveConditionalTypes.ts, 63, 44))
type T3 = Box<T2>;
>T3 : Symbol(T3, Decl(recursiveConditionalTypes.ts, 66, 18))
>Box : Symbol(Box, Decl(recursiveConditionalTypes.ts, 55, 21))
>T2 : Symbol(T2, Decl(recursiveConditionalTypes.ts, 65, 22))
type T4 = Box<T3>;
>T4 : Symbol(T4, Decl(recursiveConditionalTypes.ts, 67, 18))
>Box : Symbol(Box, Decl(recursiveConditionalTypes.ts, 55, 21))
>T3 : Symbol(T3, Decl(recursiveConditionalTypes.ts, 66, 18))
type T5 = Box<T4>;
>T5 : Symbol(T5, Decl(recursiveConditionalTypes.ts, 68, 18))
>Box : Symbol(Box, Decl(recursiveConditionalTypes.ts, 55, 21))
>T4 : Symbol(T4, Decl(recursiveConditionalTypes.ts, 67, 18))
type T6 = Box<T5>;
>T6 : Symbol(T6, Decl(recursiveConditionalTypes.ts, 69, 18))
>Box : Symbol(Box, Decl(recursiveConditionalTypes.ts, 55, 21))
>T5 : Symbol(T5, Decl(recursiveConditionalTypes.ts, 68, 18))
declare let b1: Box<Box<Box<Box<Box<Box<string>>>>>>;
>b1 : Symbol(b1, Decl(recursiveConditionalTypes.ts, 72, 11))
>Box : Symbol(Box, Decl(recursiveConditionalTypes.ts, 55, 21))
>Box : Symbol(Box, Decl(recursiveConditionalTypes.ts, 55, 21))
>Box : Symbol(Box, Decl(recursiveConditionalTypes.ts, 55, 21))
>Box : Symbol(Box, Decl(recursiveConditionalTypes.ts, 55, 21))
>Box : Symbol(Box, Decl(recursiveConditionalTypes.ts, 55, 21))
>Box : Symbol(Box, Decl(recursiveConditionalTypes.ts, 55, 21))
declare let b2: T6;
>b2 : Symbol(b2, Decl(recursiveConditionalTypes.ts, 73, 11))
>T6 : Symbol(T6, Decl(recursiveConditionalTypes.ts, 69, 18))
declare let b3: InfBox<string>;
>b3 : Symbol(b3, Decl(recursiveConditionalTypes.ts, 74, 11))
>InfBox : Symbol(InfBox, Decl(recursiveConditionalTypes.ts, 60, 36))
declare let b4: { value: { value: { value: typeof b4 }}};
>b4 : Symbol(b4, Decl(recursiveConditionalTypes.ts, 75, 11))
>value : Symbol(value, Decl(recursiveConditionalTypes.ts, 75, 17))
>value : Symbol(value, Decl(recursiveConditionalTypes.ts, 75, 26))
>value : Symbol(value, Decl(recursiveConditionalTypes.ts, 75, 35))
>b4 : Symbol(b4, Decl(recursiveConditionalTypes.ts, 75, 11))
unbox(b1); // string
>unbox : Symbol(unbox, Decl(recursiveConditionalTypes.ts, 61, 32))
>b1 : Symbol(b1, Decl(recursiveConditionalTypes.ts, 72, 11))
unbox(b2); // string
>unbox : Symbol(unbox, Decl(recursiveConditionalTypes.ts, 61, 32))
>b2 : Symbol(b2, Decl(recursiveConditionalTypes.ts, 73, 11))
unbox(b3); // InfBox<string>
>unbox : Symbol(unbox, Decl(recursiveConditionalTypes.ts, 61, 32))
>b3 : Symbol(b3, Decl(recursiveConditionalTypes.ts, 74, 11))
unbox({ value: { value: { value: { value: { value: { value: 5 }}}}}}); // number
>unbox : Symbol(unbox, Decl(recursiveConditionalTypes.ts, 61, 32))
>value : Symbol(value, Decl(recursiveConditionalTypes.ts, 80, 7))
>value : Symbol(value, Decl(recursiveConditionalTypes.ts, 80, 16))
>value : Symbol(value, Decl(recursiveConditionalTypes.ts, 80, 25))
>value : Symbol(value, Decl(recursiveConditionalTypes.ts, 80, 34))
>value : Symbol(value, Decl(recursiveConditionalTypes.ts, 80, 43))
>value : Symbol(value, Decl(recursiveConditionalTypes.ts, 80, 52))
unbox(b4); // { value: { value: typeof b4 }}
>unbox : Symbol(unbox, Decl(recursiveConditionalTypes.ts, 61, 32))
>b4 : Symbol(b4, Decl(recursiveConditionalTypes.ts, 75, 11))
unbox({ value: { value: { get value() { return this; } }}}); // { readonly value: ... }
>unbox : Symbol(unbox, Decl(recursiveConditionalTypes.ts, 61, 32))
>value : Symbol(value, Decl(recursiveConditionalTypes.ts, 82, 7))
>value : Symbol(value, Decl(recursiveConditionalTypes.ts, 82, 16))
>value : Symbol(value, Decl(recursiveConditionalTypes.ts, 82, 25))
// Inference from nested instantiations of same generic types
type Box1<T> = { value: T };
>Box1 : Symbol(Box1, Decl(recursiveConditionalTypes.ts, 82, 60))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 86, 10))
>value : Symbol(value, Decl(recursiveConditionalTypes.ts, 86, 16))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 86, 10))
type Box2<T> = { value: T };
>Box2 : Symbol(Box2, Decl(recursiveConditionalTypes.ts, 86, 28))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 87, 10))
>value : Symbol(value, Decl(recursiveConditionalTypes.ts, 87, 16))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 87, 10))
declare function foo<T>(x: Box1<Box1<T>>): T;
>foo : Symbol(foo, Decl(recursiveConditionalTypes.ts, 87, 28))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 89, 21))
>x : Symbol(x, Decl(recursiveConditionalTypes.ts, 89, 24))
>Box1 : Symbol(Box1, Decl(recursiveConditionalTypes.ts, 82, 60))
>Box1 : Symbol(Box1, Decl(recursiveConditionalTypes.ts, 82, 60))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 89, 21))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 89, 21))
declare let z: Box2<Box2<string>>;
>z : Symbol(z, Decl(recursiveConditionalTypes.ts, 91, 11))
>Box2 : Symbol(Box2, Decl(recursiveConditionalTypes.ts, 86, 28))
>Box2 : Symbol(Box2, Decl(recursiveConditionalTypes.ts, 86, 28))
foo(z); // unknown, but ideally would be string (requires unique recursion ID for each type reference)
>foo : Symbol(foo, Decl(recursiveConditionalTypes.ts, 87, 28))
>z : Symbol(z, Decl(recursiveConditionalTypes.ts, 91, 11))
// Intersect tuple element types
type Intersect<U extends any[], R = unknown> = U extends [infer H, ...infer T] ? Intersect<T, R & H> : R;
>Intersect : Symbol(Intersect, Decl(recursiveConditionalTypes.ts, 93, 7))
>U : Symbol(U, Decl(recursiveConditionalTypes.ts, 97, 15))
>R : Symbol(R, Decl(recursiveConditionalTypes.ts, 97, 31))
>U : Symbol(U, Decl(recursiveConditionalTypes.ts, 97, 15))
>H : Symbol(H, Decl(recursiveConditionalTypes.ts, 97, 63))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 97, 75))
>Intersect : Symbol(Intersect, Decl(recursiveConditionalTypes.ts, 93, 7))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 97, 75))
>R : Symbol(R, Decl(recursiveConditionalTypes.ts, 97, 31))
>H : Symbol(H, Decl(recursiveConditionalTypes.ts, 97, 63))
>R : Symbol(R, Decl(recursiveConditionalTypes.ts, 97, 31))
type QQ = Intersect<[string[], number[], 7]>;
>QQ : Symbol(QQ, Decl(recursiveConditionalTypes.ts, 97, 105))
>Intersect : Symbol(Intersect, Decl(recursiveConditionalTypes.ts, 93, 7))
// Infer between structurally identical recursive conditional types
type Unpack1<T> = T extends (infer U)[] ? Unpack1<U> : T;
>Unpack1 : Symbol(Unpack1, Decl(recursiveConditionalTypes.ts, 99, 45))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 103, 13))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 103, 13))
>U : Symbol(U, Decl(recursiveConditionalTypes.ts, 103, 34))
>Unpack1 : Symbol(Unpack1, Decl(recursiveConditionalTypes.ts, 99, 45))
>U : Symbol(U, Decl(recursiveConditionalTypes.ts, 103, 34))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 103, 13))
type Unpack2<T> = T extends (infer U)[] ? Unpack2<U> : T;
>Unpack2 : Symbol(Unpack2, Decl(recursiveConditionalTypes.ts, 103, 57))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 104, 13))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 104, 13))
>U : Symbol(U, Decl(recursiveConditionalTypes.ts, 104, 34))
>Unpack2 : Symbol(Unpack2, Decl(recursiveConditionalTypes.ts, 103, 57))
>U : Symbol(U, Decl(recursiveConditionalTypes.ts, 104, 34))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 104, 13))
function f20<T, U extends T>(x: Unpack1<T>, y: Unpack2<T>) {
>f20 : Symbol(f20, Decl(recursiveConditionalTypes.ts, 104, 57))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 106, 13))
>U : Symbol(U, Decl(recursiveConditionalTypes.ts, 106, 15))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 106, 13))
>x : Symbol(x, Decl(recursiveConditionalTypes.ts, 106, 29))
>Unpack1 : Symbol(Unpack1, Decl(recursiveConditionalTypes.ts, 99, 45))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 106, 13))
>y : Symbol(y, Decl(recursiveConditionalTypes.ts, 106, 43))
>Unpack2 : Symbol(Unpack2, Decl(recursiveConditionalTypes.ts, 103, 57))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 106, 13))
x = y;
>x : Symbol(x, Decl(recursiveConditionalTypes.ts, 106, 29))
>y : Symbol(y, Decl(recursiveConditionalTypes.ts, 106, 43))
y = x;
>y : Symbol(y, Decl(recursiveConditionalTypes.ts, 106, 43))
>x : Symbol(x, Decl(recursiveConditionalTypes.ts, 106, 29))
f20(y, x);
>f20 : Symbol(f20, Decl(recursiveConditionalTypes.ts, 104, 57))
>y : Symbol(y, Decl(recursiveConditionalTypes.ts, 106, 43))
>x : Symbol(x, Decl(recursiveConditionalTypes.ts, 106, 29))
}
type Grow1<T extends unknown[], N extends number> = T['length'] extends N ? T : Grow1<[number, ...T], N>;
>Grow1 : Symbol(Grow1, Decl(recursiveConditionalTypes.ts, 110, 1))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 112, 11))
>N : Symbol(N, Decl(recursiveConditionalTypes.ts, 112, 31))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 112, 11))
>N : Symbol(N, Decl(recursiveConditionalTypes.ts, 112, 31))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 112, 11))
>Grow1 : Symbol(Grow1, Decl(recursiveConditionalTypes.ts, 110, 1))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 112, 11))
>N : Symbol(N, Decl(recursiveConditionalTypes.ts, 112, 31))
type Grow2<T extends unknown[], N extends number> = T['length'] extends N ? T : Grow2<[string, ...T], N>;
>Grow2 : Symbol(Grow2, Decl(recursiveConditionalTypes.ts, 112, 105))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 113, 11))
>N : Symbol(N, Decl(recursiveConditionalTypes.ts, 113, 31))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 113, 11))
>N : Symbol(N, Decl(recursiveConditionalTypes.ts, 113, 31))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 113, 11))
>Grow2 : Symbol(Grow2, Decl(recursiveConditionalTypes.ts, 112, 105))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 113, 11))
>N : Symbol(N, Decl(recursiveConditionalTypes.ts, 113, 31))
function f21<T extends number>(x: Grow1<[], T>, y: Grow2<[], T>) {
>f21 : Symbol(f21, Decl(recursiveConditionalTypes.ts, 113, 105))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 115, 13))
>x : Symbol(x, Decl(recursiveConditionalTypes.ts, 115, 31))
>Grow1 : Symbol(Grow1, Decl(recursiveConditionalTypes.ts, 110, 1))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 115, 13))
>y : Symbol(y, Decl(recursiveConditionalTypes.ts, 115, 47))
>Grow2 : Symbol(Grow2, Decl(recursiveConditionalTypes.ts, 112, 105))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 115, 13))
f21(y, x); // Error
>f21 : Symbol(f21, Decl(recursiveConditionalTypes.ts, 113, 105))
>y : Symbol(y, Decl(recursiveConditionalTypes.ts, 115, 47))
>x : Symbol(x, Decl(recursiveConditionalTypes.ts, 115, 31))
}
// Repros from #41756
type ParseSuccess<R extends string> = { rest: R };
>ParseSuccess : Symbol(ParseSuccess, Decl(recursiveConditionalTypes.ts, 117, 1))
>R : Symbol(R, Decl(recursiveConditionalTypes.ts, 121, 18))
>rest : Symbol(rest, Decl(recursiveConditionalTypes.ts, 121, 39))
>R : Symbol(R, Decl(recursiveConditionalTypes.ts, 121, 18))
type ParseManyWhitespace<S extends string> =
>ParseManyWhitespace : Symbol(ParseManyWhitespace, Decl(recursiveConditionalTypes.ts, 121, 50))
>S : Symbol(S, Decl(recursiveConditionalTypes.ts, 123, 25))
S extends ` ${infer R0}` ?
>S : Symbol(S, Decl(recursiveConditionalTypes.ts, 123, 25))
>R0 : Symbol(R0, Decl(recursiveConditionalTypes.ts, 124, 23))
ParseManyWhitespace<R0> extends ParseSuccess<infer R1> ? ParseSuccess<R1> : null :
>ParseManyWhitespace : Symbol(ParseManyWhitespace, Decl(recursiveConditionalTypes.ts, 121, 50))
>R0 : Symbol(R0, Decl(recursiveConditionalTypes.ts, 124, 23))
>ParseSuccess : Symbol(ParseSuccess, Decl(recursiveConditionalTypes.ts, 117, 1))
>R1 : Symbol(R1, Decl(recursiveConditionalTypes.ts, 125, 58))
>ParseSuccess : Symbol(ParseSuccess, Decl(recursiveConditionalTypes.ts, 117, 1))
>R1 : Symbol(R1, Decl(recursiveConditionalTypes.ts, 125, 58))
ParseSuccess<S>;
>ParseSuccess : Symbol(ParseSuccess, Decl(recursiveConditionalTypes.ts, 117, 1))
>S : Symbol(S, Decl(recursiveConditionalTypes.ts, 123, 25))
type TP1 = ParseManyWhitespace<" foo">;
>TP1 : Symbol(TP1, Decl(recursiveConditionalTypes.ts, 126, 24))
>ParseManyWhitespace : Symbol(ParseManyWhitespace, Decl(recursiveConditionalTypes.ts, 121, 50))
type ParseManyWhitespace2<S extends string> =
>ParseManyWhitespace2 : Symbol(ParseManyWhitespace2, Decl(recursiveConditionalTypes.ts, 128, 39))
>S : Symbol(S, Decl(recursiveConditionalTypes.ts, 130, 26))
S extends ` ${infer R0}` ?
>S : Symbol(S, Decl(recursiveConditionalTypes.ts, 130, 26))
>R0 : Symbol(R0, Decl(recursiveConditionalTypes.ts, 131, 23))
Helper<ParseManyWhitespace2<R0>> :
>Helper : Symbol(Helper, Decl(recursiveConditionalTypes.ts, 133, 24))
>ParseManyWhitespace2 : Symbol(ParseManyWhitespace2, Decl(recursiveConditionalTypes.ts, 128, 39))
>R0 : Symbol(R0, Decl(recursiveConditionalTypes.ts, 131, 23))
ParseSuccess<S>;
>ParseSuccess : Symbol(ParseSuccess, Decl(recursiveConditionalTypes.ts, 117, 1))
>S : Symbol(S, Decl(recursiveConditionalTypes.ts, 130, 26))
type Helper<T> = T extends ParseSuccess<infer R> ? ParseSuccess<R> : null
>Helper : Symbol(Helper, Decl(recursiveConditionalTypes.ts, 133, 24))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 135, 12))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 135, 12))
>ParseSuccess : Symbol(ParseSuccess, Decl(recursiveConditionalTypes.ts, 117, 1))
>R : Symbol(R, Decl(recursiveConditionalTypes.ts, 135, 45))
>ParseSuccess : Symbol(ParseSuccess, Decl(recursiveConditionalTypes.ts, 117, 1))
>R : Symbol(R, Decl(recursiveConditionalTypes.ts, 135, 45))
type TP2 = ParseManyWhitespace2<" foo">;
>TP2 : Symbol(TP2, Decl(recursiveConditionalTypes.ts, 135, 73))
>ParseManyWhitespace2 : Symbol(ParseManyWhitespace2, Decl(recursiveConditionalTypes.ts, 128, 39))
// Repro from #46183
type NTuple<N extends number, Tup extends unknown[] = []> =
>NTuple : Symbol(NTuple, Decl(recursiveConditionalTypes.ts, 137, 40))
>N : Symbol(N, Decl(recursiveConditionalTypes.ts, 141, 12))
>Tup : Symbol(Tup, Decl(recursiveConditionalTypes.ts, 141, 29))
Tup['length'] extends N ? Tup : NTuple<N, [...Tup, unknown]>;
>Tup : Symbol(Tup, Decl(recursiveConditionalTypes.ts, 141, 29))
>N : Symbol(N, Decl(recursiveConditionalTypes.ts, 141, 12))
>Tup : Symbol(Tup, Decl(recursiveConditionalTypes.ts, 141, 29))
>NTuple : Symbol(NTuple, Decl(recursiveConditionalTypes.ts, 137, 40))
>N : Symbol(N, Decl(recursiveConditionalTypes.ts, 141, 12))
>Tup : Symbol(Tup, Decl(recursiveConditionalTypes.ts, 141, 29))
type Add<A extends number, B extends number> =
>Add : Symbol(Add, Decl(recursiveConditionalTypes.ts, 142, 65))
>A : Symbol(A, Decl(recursiveConditionalTypes.ts, 144, 9))
>B : Symbol(B, Decl(recursiveConditionalTypes.ts, 144, 26))
[...NTuple<A>, ...NTuple<B>]['length'];
>NTuple : Symbol(NTuple, Decl(recursiveConditionalTypes.ts, 137, 40))
>A : Symbol(A, Decl(recursiveConditionalTypes.ts, 144, 9))
>NTuple : Symbol(NTuple, Decl(recursiveConditionalTypes.ts, 137, 40))
>B : Symbol(B, Decl(recursiveConditionalTypes.ts, 144, 26))
let five: Add<2, 3>;
>five : Symbol(five, Decl(recursiveConditionalTypes.ts, 147, 3))
>Add : Symbol(Add, Decl(recursiveConditionalTypes.ts, 142, 65))
// Repro from #46316
type _PrependNextNum<A extends Array<unknown>> = A['length'] extends infer T
>_PrependNextNum : Symbol(_PrependNextNum, Decl(recursiveConditionalTypes.ts, 147, 20))
>A : Symbol(A, Decl(recursiveConditionalTypes.ts, 151, 21))
>Array : Symbol(Array, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --) ... and 3 more)
>A : Symbol(A, Decl(recursiveConditionalTypes.ts, 151, 21))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 151, 74))
? [T, ...A] extends [...infer X]
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 151, 74))
>A : Symbol(A, Decl(recursiveConditionalTypes.ts, 151, 21))
>X : Symbol(X, Decl(recursiveConditionalTypes.ts, 152, 33))
? X
>X : Symbol(X, Decl(recursiveConditionalTypes.ts, 152, 33))
: never
: never;
type _Enumerate<A extends Array<unknown>, N extends number> = N extends A['length']
>_Enumerate : Symbol(_Enumerate, Decl(recursiveConditionalTypes.ts, 155, 12))
>A : Symbol(A, Decl(recursiveConditionalTypes.ts, 157, 16))
>Array : Symbol(Array, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --) ... and 3 more)
>N : Symbol(N, Decl(recursiveConditionalTypes.ts, 157, 41))
>N : Symbol(N, Decl(recursiveConditionalTypes.ts, 157, 41))
>A : Symbol(A, Decl(recursiveConditionalTypes.ts, 157, 16))
? A
>A : Symbol(A, Decl(recursiveConditionalTypes.ts, 157, 16))
: _Enumerate<_PrependNextNum<A>, N> & number;
>_Enumerate : Symbol(_Enumerate, Decl(recursiveConditionalTypes.ts, 155, 12))
>_PrependNextNum : Symbol(_PrependNextNum, Decl(recursiveConditionalTypes.ts, 147, 20))
>A : Symbol(A, Decl(recursiveConditionalTypes.ts, 157, 16))
>N : Symbol(N, Decl(recursiveConditionalTypes.ts, 157, 41))
type Enumerate<N extends number> = number extends N
>Enumerate : Symbol(Enumerate, Decl(recursiveConditionalTypes.ts, 159, 49))
>N : Symbol(N, Decl(recursiveConditionalTypes.ts, 161, 15))
>N : Symbol(N, Decl(recursiveConditionalTypes.ts, 161, 15))
? number
: _Enumerate<[], N> extends (infer E)[]
>_Enumerate : Symbol(_Enumerate, Decl(recursiveConditionalTypes.ts, 155, 12))
>N : Symbol(N, Decl(recursiveConditionalTypes.ts, 161, 15))
>E : Symbol(E, Decl(recursiveConditionalTypes.ts, 163, 38))
? E
>E : Symbol(E, Decl(recursiveConditionalTypes.ts, 163, 38))
: never;
function foo2<T extends unknown[]>(value: T): Enumerate<T['length']> {
>foo2 : Symbol(foo2, Decl(recursiveConditionalTypes.ts, 165, 12))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 167, 14))
>value : Symbol(value, Decl(recursiveConditionalTypes.ts, 167, 35))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 167, 14))
>Enumerate : Symbol(Enumerate, Decl(recursiveConditionalTypes.ts, 159, 49))
>T : Symbol(T, Decl(recursiveConditionalTypes.ts, 167, 14))
return value.length; // Error
>value.length : Symbol(Array.length, Decl(lib.es5.d.ts, --, --))
>value : Symbol(value, Decl(recursiveConditionalTypes.ts, 167, 35))
>length : Symbol(Array.length, Decl(lib.es5.d.ts, --, --))
}