TypeScript:言語の本質、静的型付け、React Native

著者: IT Sectr 公開日: 2026-02-10 読了時間: 12 分

TypeScriptは、Microsoftが開発したJavaScriptの厳密に型付けされたスーパーセットです。型システム、インターフェース、ジェネリクス、デコレータを追加し、既存のJSコードとの完全な互換性を維持します。コンパイル時の型チェックにより、TypeScriptはReact Native、Angular、その他のフレームワークにおけるエラーの一種類を防止します。State of JS Survey(2025)によると、調査対象の開発者の78%がTypeScriptを使用しています。詳細はTypeScriptドキュメントをご覧ください。

主要なポイント

  • TypeScript — コンパイル時チェックによるJS上の静的型付け
  • インターフェース — オプショナルフィールドを持つオブジェクトの形状の契約
  • ジェネリクス — 関数やクラスのための汎用型
  • React Native — 65%の新規プロジェクトがpropsとstateの型付けにTypeScriptを使用
  • tsc — ランタイムを変更せずにTSをJSにトランスパイルするコンパイラ

TypeScriptとは?

TypeScriptは、Microsoft(2012年)が開発したプログラミング言語で、Anders Hejlsberg(C#およびTurbo Pascalの生みの親)によって作られました。TypeScriptはJavaScriptを静的型システム、インターフェース、ジェネリクス、列挙型、デコレータで拡張します。TSコードはtscコンパイラまたはBabelを介して純粋なJavaScript(トランスパイル)にコンパイルされます。出力は標準的なJSで、どの環境でも動作します。

TypeScript作成の動機は、大規模プロジェクトにおけるJavaScriptの限界にあります。JSの動的型付けは、undefined is not a function、Cannot read property of nullといったエラーを実行時にしか発見できません。TypeScriptは型チェックをコンパイル時に移行し、コード実行前にこれらのエラーを防ぎます。プロジェクトが大きくなればなるほど、TSの利点は大きくなります。10万行以上のコードベースでは、TSは何百もの潜在的なバグを防ぎます。

TypeScriptの重要な機能は、tsconfig.jsonのオプションstrict: trueフラグによる厳格な型付けです。厳格モードはすべてのチェックを有効にします:strictNullChecks(null/undefinedを他の型と互換性なしとする)、noImplicitAny(暗黙のanyを禁止)、strictFunctionTypes(関数パラメータの反変性)。デフォルトでは、すべての新規プロジェクトにstrict: trueが推奨されます。

TypeScript vs JavaScript

TypeScriptは開発時にのみJavaScriptと異なります。コンパイル後、型は消去され — ランタイムはパフォーマンス低下なしに通常のJSを実行します。これはトレードオフです。開発には追加のコンパイルステップが必要ですが、IDEのオートコンプリート、シンボル名変更によるリファクタリング、コード内での型ドキュメントを提供します。

側面JavaScriptTypeScript
型付け動的、ランタイム静的、コンパイル時
ファイル拡張子.js.ts(Reactは.tsx)
型エラーランタイムで発見実行前に発見
ジェネリクスなしあり(Generic types)
インターフェースなし(JSDocのみ)あり(interface + type)
コンパイル不要必要(tsc / Babel)

TypeScriptの型システム

TypeScriptの型システムは構造的型付けであり、名前的型付けではありません。2つの型は、名前に関係なく構造が一致すれば互換性があります。これは、互換性がクラスまたはインターフェース名によって決定されるJava/C#とは異なります。構造的型付けにより、既存のJSコードとの統合が簡素化され — すべての型にimplementsを宣言する必要はありません。

基本型と高度な型

TypeScriptはJSのプリミティブ型に加えて以下をサポートします:any(チェックを無効化)、unknown(安全なany — 使用前にチェックが必要)、never(値を返さない)、void(戻り値なし)、tuple(固定長タプル)、enum(列挙型)、union(string | number)、intersection(A & B)、literal('red' | 'blue')、index signature([key: string]: number)。

typescript
// TypeScriptの基本型システム
// プリミティブ型
const name: string = 'React Native';
const version: number = 0.73;
const isReady: boolean = true;

// Union型とLiteral型
type Platform = 'ios' | 'android' | 'web';
type Status = 'idle' | 'loading' | 'success' | 'error';

function getSDKVersion(platform: Platform): number {
  switch (platform) {
    case 'ios': return 17;
    case 'android': return 34;
    case 'web': return 2025;
  }
}

// Tuple — 固定長タプル
type Coordinate = [number, number];
const position: Coordinate = [55.75, 37.61];

// Enum — 自動インクリメント列挙型
enum AppState {
  Background,
  Foreground,
  Inactive
}

// Unknown — anyの安全な代替
function parseJSON(json: string): unknown {
  return JSON.parse(json);
}

const data = parseJSON('{"name":"TS"}');
if (typeof data === 'object' && data !== null) {
  console.log((data as Record<string, unknown>).name);
}

Platform型は文字列リテラルの共用体で、値を3つの選択肢に制限します。'windows'を渡すと、TypeScriptはエラーをスローします。Coordinateタプルは正確に2つの数値を保証します — 座標やRGB色に便利です。AppState列挙型は逆マッピングを持つオブジェクトにコンパイルされます。Unknownは使用前に型チェックを強制します — anyとは異なり、unknownはデフォルトで安全です。

インターフェースと型エイリアス

インターフェース型エイリアスはTypeScriptでオブジェクトの形状を記述します。インターフェースは宣言のマージ(再宣言でフィールド追加)と拡張(extends)をサポートします。型エイリアスは共用体、交差型、タプル、条件付き型を記述できますが、宣言のマージはサポートしません。ルール:APIオブジェクトにはインターフェースを、それ以外には型を使用します。

typescript
// React Nativeのためのインターフェースと型
// オプショナルフィールドを持つインターフェース
interface User {
  id: string;
  name: string;
  email: string;
  avatar?: string; // オプショナルフィールド
  readonly createdAt: Date; // 読み取り専用
}

// インターフェースの拡張(extends)
interface AdminUser extends User {
  role: 'admin';
  permissions: string[];
}

// APIデータの型
type ApiResponse<T> = {
  data: T;
  status: Status;
  error?: string;
};

// Utility types — Partialはすべてのフィールドをオプショナルにする
type PartialUser = Partial<User>;

// Pick — 指定されたフィールドを選択
type UserPreview = Pick<User, 'id' | 'name' | 'avatar'>;

// Record — 型付けされたキーを持つ辞書
type UserMap = Record<string, User>;

Userインターフェースは?(オプショナルフィールド)とreadonly(読み取り専用)を持ちます。ApiResponse<T>はAPI応答のためのジェネリックインターフェースです。Partial<User>はすべてのフィールドをオプショナルにするユーティリティ型です(編集フォームに便利)。Pick<User, 'id' | 'name'>は指定されたフィールドのみを選択します — プレビューコンポーネントに便利です。Record<string, User>はIDによるユーザー辞書です。

ジェネリクスとユーティリティ型

ジェネリクスはTypeScriptの重要な機能であり、型安全性を失わずに任意の型で動作するコンポーネントを作成できます。ジェネリック関数は山括弧内に型パラメータを指定して定義されます:function identity<T>(arg: T): T。型Tは引数から自動的に推論されるか、明示的に指定されます:identity<string>('hello')。

ユーティリティ型は型変換のための組み込みジェネリクスです:Partial<T>(すべてのフィールドをオプショナル)、Required<T>(すべてのフィールドを必須)、Readonly<T>(すべてのフィールドを読み取り専用)、Pick<T, K>(フィールドを選択)、Omit<T, K>(フィールドを除外)、Record<K, T>(辞書)、Exclude<T, U>(共用体から除外)、Extract<T, U>(共用体から抽出)、NonNullable<T>(null/undefinedを除外)。

typescript
// TypeScriptのジェネリクス
// APIを扱うためのジェネリック関数
async function fetchData<T>(url: string): Promise<T> {
  const response = await fetch(url);

  if (!response.ok) {
    throw new Error(`HTTP ${response.status}`);
  }

  return response.json() as Promise<T>;
}

// 特定の型での使用
interface Product {
  id: number;
  title: string;
  price: number;
}

const products = await fetchData<Product[]>('/api/products');

// 状態管理のためのジェネリッククラス
class StateManager<S> {
  private state: S;

  constructor(initial: S) {
    this.state = initial;
  }

  getState(): S {
    return this.state;
  }

  updateState(partial: Partial<S>): void {
    this.state = { ...this.state, ...partial };
  }
}

// Redux Reducerでの型付けされた作業
type Action<T, P> = {
  type: T;
  payload: P;
};

type UserAction =
  | Action<'SET_USER', User>
  | Action<'CLEAR_USER', undefined>
  | Action<'UPDATE_USER', Partial<User>>;

fetchData<T>関数はfetchの型付けされたラッパーです。パラメータTは応答の形状を決定します:fetchData<Product[]>を呼び出すと、TypeScriptは返される配列にProductオブジェクトが含まれることを認識します。StateManager<S>クラスは任意の型の状態を管理します — 部分更新にはPartial<S>を使用。Action<T, P>はswitch内での自動型絞り込みを備えたReduxアクション用の識別共用体です。

React NativeにおけるTypeScript

React NativeにおけるTypeScriptは、コンポーネントのpropsとstateに厳格な型付けを提供します。React Native CLIは.tsx拡張子とtsconfig.jsonを持つテンプレートを作成します。PropTypes(JS)はTypeScriptインターフェースに置き換えられ — チェックはランタイムではなくコンパイル時に行われます。styled-componentsとReact Navigationは完全な型サポートを持っています。

コンポーネントの型付け

React.FC<Props>はpropsを持つ関数コンポーネントの型です。childrenは自動的に型付けされます。useRef<T> — ネイティブコンポーネントへの参照。useState<S> — 型推論による状態管理。useNavigation<T> — 型付けされたナビゲーション。useCallback、useMemo — 自動型推論付き。すべてのReactフックは完全に型付けされています。

typescript
// 型付けされたReact Nativeコンポーネント
import React, { useState, useCallback } from 'react';
import {
  View, Text, FlatList, TouchableOpacity,
  StyleSheet
} from 'react-native';
import { useNavigation } from '@react-navigation/native';
import { NativeStackNavigationProp } from '@react-navigation/native-stack';

// ナビゲーションとデータの型
type RootStackParamList = {
  Home: undefined;
  Profile: { userId: string };
  Settings: undefined;
};

type NavigationProp =
  NativeStackNavigationProp<RootStackParamList, 'Home'>;

// propsのインターフェース
interface ProductListProps {
  products: Product[];
  onSelect: (id: number) => void;
}

// 型付けされた関数コンポーネント
const ProductList: React.FC<ProductListProps> = ({
  products,
  onSelect
}) => {
  const navigation = useNavigation<NavigationProp>();
  const [selectedId, setSelectedId] = useState<number | null>(null);

  const handlePress = useCallback((id: number) => {
    setSelectedId(id);
    onSelect(id);
    navigation.navigate('Profile', { userId: String(id) });
  }, [onSelect, navigation]);

  const renderItem = useCallback(({ item }: { item: Product }) => (
    <TouchableOpacity onPress={() => handlePress(item.id)}>
      <Text>{item.title}</Text>
      <Text>${item.price.toFixed(2)}</Text>
    </TouchableOpacity>
  ), [handlePress]);

  return (
    <FlatList
      data={products}
      renderItem={renderItem}
      keyExtractor={(item) => String(item.id)}
    />
  );
};

RootStackParamList型は、パラメータ付きルートの辞書です。NavigationPropは型付けされたナビゲーションを提供します:navigation.navigate('Profile', { userId })はProfileがuserIdを受け入れることを検証します。型付けされたパラメータを持つuseCallbackは不要な再レンダリングを防ぎます。FlatListはジェネリクスを介して型付けされます: — dataとrenderItemは自動的に型を取得します。

TypeScript開発者ツール

TypeScriptツールには、tscコンパイラ、tsconfig.json、VS CodeのIDEサポート、@typescript-eslintを使用したESLint、Prettier、DefinitelyTyped(@types/*)が含まれます。tscは.tsを.jsに変換するコンパイラです。tsconfig.jsonは以下を設定します:target(ES2020)、module(ESNext)、strict: true、outDir(出力フォルダ)。sourceMap — コードマップを介したブラウザでのTSデバッグ。

DefinitelyTypedは、組み込み型を持たないライブラリの型定義リポジトリです。インストール:npm install @types/react @types/react-native --save-dev。.d.tsファイルは型宣言です。モダンなライブラリ(React、React Native、Angular)は組み込み型を含み、@types/を必要としません。古いJSライブラリの場合、DefinitelyTypedが唯一の型ソースです。

json
// tsconfig.json — 最小構成
{
  "compilerOptions": {
    "target": "esnext",
    "module": "commonjs",
    "strict": true,
    "jsx": "react-native",
    "moduleResolution": "node",
    "allowSyntheticDefaultImports": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true,
    "resolveJsonModule": true,
    "noEmit": true // チェックのみ、JS生成なし
  },
  "include": ["src/**/*.ts", "src/**/*.tsx"],
  "exclude": ["node_modules", "babel.config.js"]
}

strict: trueオプションはすべての型チェックを有効にします — すべてのプロジェクトに推奨。jsx: 'react-native'はJSXを変換せずに保持します(React NativeはBabelを介してJSXを処理)。moduleResolution: 'node' — Node.jsと同様のモジュール解決。esModuleInterop — CommonJSモジュールとの互換性。noEmit: true — JSファイルを生成せずにチェックのみ(BabelまたはMetroがJSを生成)。

よくある質問

TypeScriptとは?

TypeScriptは、Microsoft(2012年)のJavaScriptの厳密に型付けされたスーパーセットです。静的型付け、インターフェース、ジェネリクス、列挙型、デコレータを追加。tscを介して純粋なJSにコンパイル。任意のJSコードと互換性があります。React Native(新規プロジェクトの約65%)、Angular、Node.jsで使用。Anders Hejlsberg(C#の生みの親)によって作成されました。

なぜReact NativeでTypeScriptが使用されるのですか?

TypeScriptはReactコンポーネントのpropsとstateに厳格な型付けを提供します — 型エラーはランタイムではなくコンパイル時に捕捉されます。IDEのオートコンプリートはすべてのライブラリで機能します。ジェネリクスは複雑な構造(Redux store、API)を型付けします。React Navigationは完全なルート型付けを持っています。調査によると、JS開発者の78%がTypeScriptを使用しています。

TypeScriptはどのようにJavaScriptにコンパイルされますか?

tscコンパイラが.ts/.tsxファイルを解析し、型をチェックし、アノテーションを削除して.jsを生成します。ターゲット(ES5、ES2020)はtsconfig.jsonで設定します。TypeScriptはランタイムを変更しません — 消去された型はパフォーマンスに影響しません。ソースマップはデバッグ用にコンパイル済みJSを元のTSにリンクします。@babel/preset-typescriptを使用したBabelはtscの代替です。

TypeScriptはどのようなデータ型をサポートしていますか?

TypeScriptはすべてのJS型を含みます:string、number、boolean、null、undefined、symbol、any。さらに追加:void、never、unknown、tuple、enum、union(string | number)、intersection(A & B)、literal('red' | 'blue')、Record、Pick、Omit、Partial、Required、Readonly、Extract、Exclude、NonNullable。ジェネリクスは汎用型を作成します:Array<number>、Promise<string>、Map<string, User>。

TypeScript開発にはどのようなツールが必要ですか?

tscコンパイラはtypescript npmパッケージに含まれています。VS Code — ネイティブTSサポート、オートコンプリート、リファクタリングを備えたIDE。tsconfig.jsonは厳格モードを設定。@typescript-eslint/parserを使用したESLint — 静的解析。Prettier — フォーマット。DefinitelyTyped(@types/*) — 組み込みサポートのないライブラリ用の型。React Native CLIにはTypeScriptテンプレートが含まれています。

まとめ

  • TypeScript — JS上の静的型付け、tscを介して純粋なJSにコンパイル
  • インターフェースと型エイリアスはオプショナルおよび読み取り専用フィールドを持つオブジェクト形状を記述
  • ジェネリクス — 関数、クラス、ユーティリティ型(Partial、Pick、Record)のための汎用型
  • React Native — RootStackParamListを介したprops、state、ナビゲーションの厳格な型付け
  • strict: true — すべての新規プロジェクトに必須のtsconfig.jsonオプション
  • DefinitelyTyped — 独自型のないライブラリ用の@types/パッケージ
  • 開発者の78%がState of JS(2025)によるとTypeScriptを使用

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください