型安全性

型システムによってコンパイル時に不正な操作を検出し、実行時エラーを未然に防ぐ性質

型システム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 の補完やリファクタリング支援が充実する。型定義がそのままドキュメントとして機能し、リファクタリング時に型エラーで影響範囲を把握できるため安全に変更できる。

型安全性の理解を深めるには関連書籍が参考になる。

関連用語