This may be a duplicate question; however I can't seem to find an answer, so please feel free to point me somewhere if it has already been answereded.
When working with generics, I find that typescript infers different types depending on whether I wrap a generic used as an array member. For example,
// Set up
type Wrapped<I> = { _i: I };
// Not working example
function foo1<TInner extends unknown>(bar: Wrapped<TInner>[]) {
return bar;
}
const a = foo1([{ _i: 5 }, { _i: "six" }]); // TInner = number, compiler complains about second array member despite the fact that it's inferring it
// Working example
function foo2<TInner extends Wrapped<unknown>>(bar: TInner[]) {
return bar;
}
const b = foo2([{ _i: 5 }, { _i: "six" }]); // TInner = Wrapped<number> | Wrapped<string>
Why is this the case? Is there something in the documentation I'm missing? More generically, can anyone point me to a good explanation of how typescript does inference of generics?