TypeScript infer の使い所

{id: 100} や {id: '100’} のように、id というプロパティをもつオブジェクトの id の型を取得したい。

type Id<T> = T extends {id: infer U} ? U : never;

T が id というプロパティを持っている場合は、その id の型を返す。

もし、id というプロパティがなければ never を返す。

type Item1 = {id: number};
type Item2 = {id: string};
type Item3 = {name: number};

type AAA = Id<{id: number}>; //number
type BBB = Id<{id: string}>; //string
type CCC = Id<{name: number}>; //never