TypeScriptとは?JavaScriptとの違いをわかりやすく解説
TypeScriptは、MicrosoftによってJavaScriptに静的型付けを追加したオープンソースの言語です。2012年のリリース以来、急速に普及し、2026年現在では多くのエンタープライズ開発プロジェクトで採用されています。
JavaScriptは動的型付け言語のため、変数の型がコード実行時に決まります。これにより柔軟な開発が可能ですが、大規模なプロジェクトではバグの温床になりやすいデメリットがあります。TypeScriptはこの問題をコンパイル時の型チェックで解決します。
TypeScriptのメリット5つ
- コンパイル時のエラー検出:実行前に型エラーを発見できる
- IDEの補完機能向上:Visual Studio Codeなどでインテリセンスが活躍
- リファクタリングが安全:型情報により影響範囲が把握しやすい
- ドキュメントとしての型定義:関数の引数・戻り値が一目瞭然
- 大規模開発に最適:チーム開発での品質向上に貢献
TypeScript環境構築:インストールから最初のコードまで
TypeScriptを始めるには、まずNode.jsをインストールし、npmでTypeScriptコンパイラをインストールします。
# TypeScriptのインストール
npm install -g typescript
# バージョン確認
tsc --version
# TypeScriptファイルのコンパイル
tsc hello.ts
tsconfig.jsonの基本設定
プロジェクトルートにtsconfig.jsonを作成することで、TypeScriptのコンパイル設定を管理できます。以下は2026年の推奨設定です。
{
"compilerOptions": {
"target": "ES2022",
"module": "commonjs",
"lib": ["ES2022", "DOM"],
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"outDir": "./dist",
"rootDir": "./src"
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"]
}
TypeScriptの基本型:よく使う型定義一覧
TypeScriptには豊富な型システムがあります。まずは基本的な型から理解しましょう。
// 基本型
const name: string = "田中太郎";
const age: number = 25;
const isActive: boolean = true;
const nothing: null = null;
const undef: undefined = undefined;
// 配列型
const scores: number[] = [95, 87, 92];
const names: Array<string> = ["Alice", "Bob", "Charlie"];
// タプル型
const profile: [string, number] = ["田中太郎", 25];
// Union型(複数の型を許容)
let id: string | number = "user_001";
id = 42; // OK
// any型(型チェックを無効化 - 使用は最小限に)
let flexible: any = "なんでも";
flexible = 123;
// unknown型(anyより安全な代替)
let safeAny: unknown = "安全な値";
if (typeof safeAny === "string") {
console.log(safeAny.toUpperCase()); // 型ガード後は使用可能
}
インターフェースと型エイリアス:使い分けの完全ガイド
オブジェクトの型定義にはinterfaceとtype(型エイリアス)の2つの方法があります。それぞれの特徴を理解して使い分けましょう。
// interfaceの定義
interface User {
id: number;
name: string;
email: string;
age?: number; // ?で省略可能プロパティ
readonly createdAt: Date; // readonlyで変更不可
}
// type(型エイリアス)の定義
type Product = {
id: string;
name: string;
price: number;
category: "electronics" | "clothing" | "food"; // リテラル型
};
// interfaceは宣言マージが可能
interface User {
avatar?: string; // 追加プロパティを後から追加できる
}
// typeは交差型で拡張
type AdminUser = User & {
role: "admin" | "superadmin";
permissions: string[];
};
interfaceとtypeの使い分けの目安
一般的な使い分けの指針として、オブジェクトや関数の形状定義にはinterface、ユニオン型や交差型、型の計算にはtypeを使うことが多いです。ただし、チームのコーディング規約に従うことが最も重要です。
ジェネリクス:再利用可能なコードの書き方
ジェネリクス(Generics)は、型を引数として受け取る機能です。同じロジックを複数の型に対して再利用できます。
// ジェネリック関数
function identity<T>(arg: T): T {
return arg;
}
console.log(identity<string>("Hello")); // "Hello"
console.log(identity<number>(42)); // 42
// ジェネリックインターフェース
interface ApiResponse<T> {
data: T;
status: number;
message: string;
}
// 使用例
type UserResponse = ApiResponse<User>;
type ProductListResponse = ApiResponse<Product[]>;
// ジェネリック制約
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
const user: User = { id: 1, name: "田中", email: "tanaka@example.com", createdAt: new Date() };
const userName = getProperty(user, "name"); // string型と推論される
TypeScriptの実践的なパターン:実務で使えるテクニック
型ガードで安全なコードを書く
// typeof型ガード
function processValue(value: string | number): string {
if (typeof value === "string") {
return value.toUpperCase();
}
return value.toFixed(2);
}
// instanceof型ガード
class Cat {
meow() { return "にゃー"; }
}
class Dog {
bark() { return "わんわん"; }
}
function makeSound(animal: Cat | Dog): string {
if (animal instanceof Cat) {
return animal.meow();
}
return animal.bark();
}
// カスタム型ガード
interface Admin extends User {
adminLevel: number;
}
function isAdmin(user: User): user is Admin {
return "adminLevel" in user;
}
Mapped TypesとConditional Types
// Mapped Types:既存の型から新しい型を生成
type ReadOnly<T> = {
readonly [K in keyof T]: T[K];
};
type Optional<T> = {
[K in keyof T]?: T[K];
};
// Conditional Types:条件に応じて型を変える
type IsString<T> = T extends string ? true : false;
type Test1 = IsString<string>; // true
type Test2 = IsString<number>; // false
// Utility Types(TypeScript組み込み)
type PartialUser = Partial<User>; // すべてのプロパティをオプショナルに
type RequiredUser = Required<User>; // すべてのプロパティを必須に
type UserWithoutEmail = Omit<User, "email">; // 特定のプロパティを除外
type UserIdAndName = Pick<User, "id" | "name">; // 特定のプロパティのみ抽出
ReactとTypeScript:実践的な組み合わせ方
TypeScriptはReactとの組み合わせで真価を発揮します。Props、State、EventHandlerに型を付けることで、堅牢なUIコンポーネントを作成できます。
import React, { useState, useCallback } from "react";
// Propsの型定義
interface ButtonProps {
label: string;
onClick: () => void;
variant?: "primary" | "secondary" | "danger";
disabled?: boolean;
children?: React.ReactNode;
}
// 関数コンポーネントの型定義
const Button: React.FC<ButtonProps> = ({
label,
onClick,
variant = "primary",
disabled = false,
children,
}) => {
return (
<button
className={`btn btn-${variant}`}
onClick={onClick}
disabled={disabled}
>
{label}
{children}
</button>
);
};
// useStateの型指定
const [count, setCount] = useState<number>(0);
const [user, setUser] = useState<User | null>(null);
// イベントハンドラーの型
const handleChange = useCallback(
(e: React.ChangeEvent<HTMLInputElement>) => {
console.log(e.target.value);
},
[]
);
export default Button;
TypeScript学習ロードマップ2026
TypeScriptをマスターするための学習ロードマップを紹介します。
- 基礎フェーズ(1〜2週間):基本型、interface、Union/Intersection型の理解
- 中級フェーズ(2〜4週間):ジェネリクス、型ガード、Utility Types
- 実践フェーズ(1〜2ヶ月):React/Node.jsと組み合わせた実プロジェクト
- 上級フェーズ(継続):Mapped Types、Conditional Types、デコレーター、型レベルプログラミング
TypeScript学習におすすめのリソース
TypeScriptを効率よく学ぶためのリソースをまとめました。公式ドキュメントのTypeScript Handbook、「プログラミングTypeScript」(Boris Cherny著)、「TypeScript Deep Dive」(Basarat Ali Syed著)などが定評のある学習リソースです。また、TypeScript PlaygroundでブラウザからTypeScriptを試せるため、環境構築なしに実践的な学習ができます。
まとめ:TypeScriptで開発品質を向上させよう
TypeScriptは学習コストがかかりますが、その投資対効果は非常に高いです。特に中〜大規模プロジェクト、チーム開発において、バグの早期発見やコードの可読性向上に大きく貢献します。2026年現在、フロントエンド・バックエンドを問わず、TypeScriptは現代のWebエンジニアにとって必須スキルと言えるでしょう。
まずはtsconfig.jsonの設定から始め、既存のJavaScriptプロジェクトに徐々にTypeScriptを導入する「マイグレーション」から始めることをおすすめします。完璧な型安全性を目指すより、少しずつ型を付けていく方が実践的です。