こんにちは、 @kz_morita です。
今回は,TypeScript の Type Guard について簡単にまとめます.
Type Guard について
例えば,ある API にリクエストを投げてその結果を取得するようなユースケースを想定します.
以下のような型定義が考えられると思います.
type APIError = {
// ...
}
type Data = {
// ...
}
type SuccessResponse = {
data: Data;
}
type FailureResponse = {
error: APIError;
}
type Response = SuccessResponse | FailureResponse;
この場合,たとえば 成功時のデータを取得する場合は,以下のようにキャストする必要があります.
const response: Response = api.request();
if (response as SuccessResponse) {
const data = (response as SuccessResponse).data;
}
Type Guard を使用すると,型チェックと,方の推論が自動で行われてシンプルに記述することが出来ます.
具体的には,以下のように Response の型を拡張します.
type SuccessResponse = {
isSuccess: true;
data: Data;
}
type FailureResponse = {
isSuccess: false;
error: APIError;
}
そして以下のようなチェックの関数を用意します.
function isSucess(
response: SuccessResponse | FailureResponse
): response is SuccessResponse {
return (response as SuccessResponse).isSuccess === true;
}
これらを利用すると以下のように,利用することが出来ます.
const response: Response = api.request();
if (isSuccess(response)) {
// SuccessResponse と推論される
const data = response.data;
} else {
// FailureResponse と推論される
console.log(response.error);
}
まとめ
今回は,Type Guard についてまとめてみました.
Type Guard もそうですが,TypeScript 触っているとなかなか書き心地が良くて気持ち良いですね.