本記事では、TypeScriptのas(型アサーション)
について解説します。
TypeScriptには、コードをもとに型推論する機能がありますが、asではこれを上書きして型を伝えることができます。この型推論の上書きを型アサーションと言います。
as(型アサーション)
as(型アサーション)
は式 as 型
の構文で記述します。
以下が例です。
const age: number | string = "22";
const ageNumber: number = (age as string).length;
注意点
使用はできるだけ避ける
TypeScriptが提供する型推論を開発者が強制的に上書きするため、安全性が保証されません。開発者が記述する内容が間違っている場合、ランタイムエラーが発生しバグを生んでしまいます。
値を変換しているわけではない
型アサーションでは実際の値を変えているわけではなく、TypeScriptのコンパイラが認識する型を変えているだけです。
// 値の型を明示せずに宣言
let age: number | string = "12345";
// 型アサーションで string 型を指定
let stringLength: number = (someValue as string).length;
console.log(stringLength); // 出力: 5
console.log(age); // 出力: "12345" (値自体は変更されていない)
ここでは、型がnumber | string
であるsomeValueをstring
に型アサーションしています。someValueがnumber
かstring
かの可能性がありますが、string
として扱われます。そして、age自体の値は”12345″のままです。
無制限に変換できるわけではない
共通部分が少ない型同士では型アサーションで変換はできません。
// 簡単な例
const someNumber: number = 123;
const str: string = someNumber as string
type User = {
id: number;
name: string;
};
type Product = {
id: number;
price: number;
};
// User型を宣言
const user: User = {
id: 1,
name: "Yamada Taro",
};
// Product型への型アサーションを試みる
const product: Product = user as Product;
// エラー: User 型と Product 型に共通部分が少ないため変換できません
使いどき
型アサーションの使用には気をつける必要があると説明しました。では、どのようなときに使えば良いでしょうか?それは開発者が型推論よりも確実に正しいと自信を持てるときです。
外部データの型が明確な場合
外部ライブラリや API から取得したデータが、実際には型が明確であるにもかかわらず TypeScript が正確に推論できない場合、型アサーションを使います。
type User = { id: number; name: string };
const data: any = { id: 1, name: "Yamada Taro" }; // 外部から取得したデータ
const user: User = data as User; // データがUser型であることを保証
一部のユースケースで型が具体的である場合
開発者がデータの状態を完全に把握しており、型システムの型推論では undefined
の可能性を排除できない場合に、型アサーションを使用します。
以下の例では、User
型の email
プロパティはオプショナル(email?
)であるため、string
または undefined
の可能性があります。email
が undefined
の場合、toLowerCase()
メソッドを呼び出すとエラーになります。ただし、userWithEmail
のデータには email
が必ず存在すると開発者が確信しているため、型アサーションを使ってコンパイラにそのことを伝えています。
// 全体の型
type User = {
id: number;
name: string;
email?: string; // email は省略可能
};
// プロパティの一部だけを使用する場合
function getUserInfo(user: User) {
// 必ず email が存在すると分かっている場合、型アサーションを使用
const email = user.email as string;
console.log(`User's email: ${email.toLowerCase()}`);
}
// 使用例
const userWithEmail: User = {
id: 1,
name: "Yamada Taro",
email: "y.taro@example.com",
};
getUserInfo(userWithEmail); // User's email: y.taro@example.com
まとめ
型アサーションは TypeScript における強力なツールですが、型安全性を損なう可能性があるため、慎重に使用する必要があります。以下のポイントを念頭に置いて使用してください:
- 開発者が型推論よりも正確な型を保証できる場合に使用する。
- 型アサーションを使う前に、型ガードやバリデーションの利用を検討する。
- 過度に依存すると型安全性が失われるため、必要最小限に留める。