引数のbooleanで戻り値の型を変化させたい
Q&A
解決したいこと
typescriptで、引数にbooleanを渡すことによって、その値によって戻り値の型を変化させたい。
例)
function getString<R extends boolean>(require: R): R extends true ? string : string | null{
if (require === true) {
return requireString(); // string
} else {
return optionalString(); // string | null
}
}
発生している問題・エラー
return optionalString()
にて以下のエラーが発生します。
Type 'string | null' is not assignable to type 'R extends true ? string : string | null'.
Type 'null' is not assignable to type 'R extends true ? string : string | null'.
getString<boolean>(false);
と呼び出すことで、戻り値の型がstring
になっているにも関わらず、実際はstring | null
が返ってくるという状態が発生するので、エラー自体は起こりうる状態の提示をされていると思います。
ただ、trueとfalseを全て入れ替えた以下のコードでも同様のエラーが発生します。
function getString<R extends boolean>(require: R): R extends false ? string | null : string{
if (require === false) {
return optionalString(); // 同じエラーが発生する
} else {
return requireString();
}
}
こちらでもエラーが発生する現実的なRの値は思いついていないのですが、if (require === false)
内でも、requireの型がR extends boolean
になっているため、そこからエラーになっているようです。
ここからが本題なのですが、上記の通り、引数require
によって戻り値の型を変化させたいのですが、この時、上記エラーが出ないように適切に分岐させたコードを記述をする方法はあるのでしょうか?
return optionalString() as R extends false ? string | null : string;
と、asを用いた記述をするとエラー自体は消えるのですが、それ以外でもし他の方法があれば教えていただきたいです。