conditional types
// type Exclude<T, U> = T extends U ? never : T;
type MyExclude =
( string extends string | number ? never : string ) // never
| ( number extends string | number ? never : number ) // never
| ( DebugType extends string | number ? never : DebugType ) // DebugType
type MyFunctionType = MyExclude
infer
type MyReturnType<T extends (...args: any) => any> = T extends (
...args: any
) => infer R
? R
: any;
// infer = 条件の一部としてジェネリクス型(<T extends (...args: any) => any>)を宣言することができる
// infer R = <T extends (...args: any) => any> 後ろのanyを取得
// (...args: any) => any = 関数を意味する → Tは関数