6時だョ!!全員集合!!

Rails・JavaScrictを中心にアウトプットします。

2022年4月7日 りあクト! 第4章 型アサーションと型ガード asによる型アサーション (p.201~)

アサーションとは

開発者が型を断定することを、型アサーションと言います。型を断定することによって、コンパイラによる型チェックを強引に通すことができます。しかし、断定した型でコードが実行されるので、メソッドが呼び出せない等、予期せぬエラーが発生します。

type User = { username: string; address: { zipcode: string; town: string } };
const str = `{ "username": "patty", "town": "Maple Town" }`;
const data: unknown = JSON.parse(str);
const user = data as User;
console.log(user.address.town); // TypeError: Cannot read property 'town' of undefined
  • エイリアス type User という型の参照を定義します。
  • JSONデータをunknown型で受け付けます。
  • T as (U extends T) または (T extends U) as Uであるときに、asの記述ができます。
  • dataがUser型ということを断定して変数userに代入します。
  • addressが存在しないため、タイプエラーとなります。つまり、型の安全性が保証されていないということです。

アサーションはあくまでコンパイラによる型の解釈が変わるだけであり、実際の値が変化しているわけではありません。

型キャスト

異なるデータ型の値を任意の型にコンバートするものです。

const n = 123;
const s1 = String(n);
console.log(s1); // "123"
console.log(typeof s1); // string

const s2 = n as string; // nを文字列型として断定しようとしている
  • 数値をStringコンストラクタで文字列に変換しています。
  • 最後の行はnを文字列型として断定しようとしていますがエラーが発生します。
  • アサーションはスーパータイプ、サブタイプの関係性がないと使えません。

二重アサーション

unkonwn型を挟む形で二重アサーションを行えばコンパイルは通ってしまいますが、推奨されていません。

アサーションの抜け道

const str = (123 as unknown) as string; // unknownはスーパータイプ
str.split(',');
str.split(',');
// エラー ▶ Uncaught TypeError: n.split is not a function

参考

りあクト! 【Ⅰ. 言語・環境編】 p.201