型安全性
型システムによってコンパイル時に不正な操作を検出し、実行時エラーを未然に防ぐ性質
型システムTypeScript
型安全性とは
型安全性 (Type Safety) は、型システムによってコンパイル時に不正な操作を検出し、実行時エラーを未然に防ぐ性質である。TypeScript の strict: true が型安全性を最大限に活用する設定。
型安全 vs 型なし
// ❌ JavaScript (型なし): 実行時にエラー
function add(a, b) { return a + b; }
add(1, '2'); // "12" (文字列結合、意図しない挙動)
// ✅ TypeScript (型安全): コンパイル時にエラー
function add(a: number, b: number): number { return a + b; }
add(1, '2'); // ❌ コンパイルエラー: string は number に代入できない
型安全性のレベル
| レベル | 言語 | 検出タイミング |
|---|---|---|
| 動的型付け | JavaScript, Python | 実行時 |
| 静的型付け (弱い) | TypeScript (strict: false) | コンパイル時 (一部) |
| 静的型付け (強い) | TypeScript (strict: true), Rust | コンパイル時 (厳密) |
strict: true の効果
// strictNullChecks: null/undefined を型で管理
function getUser(id: string): User | null { ... }
const user = getUser('123');
user.name; // ❌ コンパイルエラー: null の可能性
if (user) user.name; // ✅ null チェック後は安全
// noUncheckedIndexedAccess: 配列アクセスの安全性
const arr = [1, 2, 3];
const x: number = arr[10]; // ❌ number | undefined
型で不正な状態を防ぐ
// ❌ string で何でも受け入れる
function setStatus(status: string) { ... }
setStatus('actve'); // タイポに気づかない
// ✅ ユニオン型で制限
type Status = 'active' | 'inactive' | 'suspended';
function setStatus(status: Status) { ... }
setStatus('actve'); // ❌ コンパイルエラー
Branded Type (より強い型安全性)
type UserId = string & { readonly __brand: 'UserId' };
type OrderId = string & { readonly __brand: 'OrderId' };
function getUser(id: UserId): User { ... }
function getOrder(id: OrderId): Order { ... }
const userId = '123' as UserId;
const orderId = '456' as OrderId;
getUser(orderId); // ❌ コンパイルエラー: OrderId は UserId に代入できない
型安全性のメリット
コンパイル時にエラーを検出するためバグを早期に発見でき、IDE の補完やリファクタリング支援が充実する。型定義がそのままドキュメントとして機能し、リファクタリング時に型エラーで影響範囲を把握できるため安全に変更できる。
型安全性の理解を深めるには関連書籍が参考になる。