TypeScriptはMicrosoftが開発したJavaScriptのスーパーセットで、静的型付けによって大規模アプリケーションの開発を安全かつ効率的に行えます。2026年現在、フロントエンド・バックエンドを問わず採用率が急上昇しており、モダンWeb開発のデファクトスタンダードとなっています。
TypeScriptとは何か?JavaScriptとの違い
TypeScriptの最大の特徴は静的型チェックです。コンパイル時に型エラーを検出できるため、実行時バグを大幅に減らせます。
// JavaScript(型なし)
function add(a, b) {
return a + b;
}
add("10", 20); // "1020" になってしまう
// TypeScript(型あり)
function add(a: number, b: number): number {
return a + b;
}
add("10", 20); // コンパイルエラー → バグを事前に防げる
TypeScriptのセットアップ
# Node.jsインストール後
npm install -g typescript
# バージョン確認
tsc --version
# tsconfig.json の初期化
tsc --init
基本的な型システム
プリミティブ型
const name: string = "Taro";
const age: number = 28;
const isActive: boolean = true;
const nothing: null = null;
const notDefined: undefined = undefined;
配列・タプル
const skills: string[] = ["TypeScript", "React", "Node.js"];
const point: [number, number] = [35.6762, 139.6503];
// ジェネリクスを使った配列
const users: Array<{id: number; name: string}> = [
{ id: 1, name: "Taro" },
{ id: 2, name: "Hanako" }
];
インターフェースと型エイリアス
// interface(オブジェクトの形を定義)
interface User {
id: number;
name: string;
email?: string; // オプショナルプロパティ
readonly createdAt: Date; // 読み取り専用
}
// type alias
type Role = "admin" | "editor" | "viewer";
// 型の組み合わせ
type AdminUser = User & { role: "admin"; permissions: string[] };
ジェネリクス(Generic Types)
ジェネリクスは型を動的に指定できる仕組みで、再利用性の高いコードを書けます。
// ジェネリック関数
function getFirst(arr: T[]): T | undefined {
return arr[0];
}
const firstNum = getFirst([1, 2, 3]); // number型
const firstStr = getFirst(["a", "b"]); // string型
// ジェネリッククラス
class Repository {
private items: T[] = [];
add(item: T): void {
this.items.push(item);
}
findById(id: number): T | undefined {
return this.items.find(item => item.id === id);
}
}
実践:ReactとTypeScriptの組み合わせ
import React, { useState, useCallback } from 'react';
// Propsの型定義
interface ButtonProps {
label: string;
onClick: () => void;
disabled?: boolean;
variant?: 'primary' | 'secondary' | 'danger';
}
// 型安全なReactコンポーネント
const Button: React.FC = ({
label,
onClick,
disabled = false,
variant = 'primary'
}) => {
return (
<button
onClick={onClick}
disabled={disabled}
className={`btn btn-${variant}`}
>
{label}
</button>
);
};
// カスタムHookの型定義
function useCounter(initialValue: number = 0) {
const [count, setCount] = useState<number>(initialValue);
const increment = useCallback(() => setCount(c => c + 1), []);
const decrement = useCallback(() => setCount(c => c - 1), []);
const reset = useCallback(() => setCount(initialValue), [initialValue]);
return { count, increment, decrement, reset };
}
TypeScript設定ファイル(tsconfig.json)のベストプラクティス
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "Bundler",
"strict": true,
"noUncheckedIndexedAccess": true,
"exactOptionalPropertyTypes": true,
"noImplicitReturns": true,
"paths": {
"@/*": ["./src/*"]
}
}
}
よくあるTypeScriptエラーと対処法
- Type ‘X’ is not assignable to type ‘Y’:型が一致していない。Union型やtype guardで対応
- Object is possibly ‘undefined’:Optional chainingや型ガードで対応
- Property ‘X’ does not exist on type ‘Y’:インターフェース定義を見直す
まとめ
TypeScriptは初期学習コストがかかりますが、中規模以上のプロジェクトでは開発速度・保守性・バグ削減において圧倒的なメリットがあります。2026年のフロントエンド開発において、TypeScriptの習得は必須スキルといえるでしょう。