お題
ReturnType<T>
を使用せず、T
の戻り値の型を取得する型MyReturnType
を実装する。
やりたいこと
type Result1 = MyReturnType<() => string>; // => string
const fn = (v: boolean) => {
if (v)
return 1
else
return 2
}
type Result2 = MyReturnType<typeof fn>; // => "1 | 2"
解答
type MyReturnType<T extends (...args: any[]) => any> =
T extends (...args: any[]) => infer U
? U
: never;
解説
処理の流れ
-
<T extends (...args: any[]) => any>
T
が関数の型であることを制約 -
T extends (...args: any[]) => infer U ? U : never;
Infer
を使って、関数の戻り値の型を推論
条件分岐に従って、戻り値の型かnever
を返す
今回の問題は、初級編 3312・Parametersと似ています。こちらの解説記事を参考にしてみてください!
関数の型を宣言するには?
残余引数とは...
inferとは...
今回の問題