TypeScript infer
https://reosablo.hatenablog.jp/entry/2020/08/25/005957
https://www.typescriptlang.org/ja/play#example/conditional-types
Conditional Typesのextendsの条件として利用
type Id<T> = T extends { id: infer U } ? U : never;
type GetReturnValue<T> = T extends (...args: any[]) => infer R ? R : T;
もし〜であれば、その型を返す
上の例の場合、もし関数であれば関数の返り値を元にRを作成しそれを返す
https://zenn.dev/brachio_takumi/articles/464106a6a80eca8ab919