TypeScript でジェネリクスの部分的な型推論ができない

const obj: any = { a: 1, b: "x" };

function foo<T, U>(x: U): [T, U] {
  return [obj[x], x];
}

こういうコードがあったとする。コードの良し悪しは置いといて、U は引数から推論して、T は呼び出す側から指定したいというケース。

// こう書きたいけどエラー
foo<number>("a"); // Expected 2 type arguments, but got 1

// これは通る
foo<number, string>("a");

これは今現在(TypeScript 4.0)ではできないみたいで、Proposal があがっていた。

https://github.com/microsoft/TypeScript/issues/26242

ワークアラウンドな方法を見つけたけどこれを使うぐらいなら素直に型引数書いたほうがよさそう。

https://medium.com/@nandiinbao/partial-type-argument-inference-in-typescript-and-workarounds-for-it-d7c772788b2e