TypeScriptは、Microsoftが開発したJavaScriptの厳密に型付けされたスーパーセットです。型システム、インターフェース、ジェネリクス、デコレータを追加し、既存のJSコードとの完全な互換性を維持します。コンパイル時の型チェックにより、TypeScriptはReact Native、Angular、その他のフレームワークにおけるエラーの一種類を防止します。State of JS Survey(2025)によると、調査対象の開発者の78%がTypeScriptを使用しています。詳細は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は開発時にのみJavaScriptと異なります。コンパイル後、型は消去され — ランタイムはパフォーマンス低下なしに通常のJSを実行します。これはトレードオフです。開発には追加のコンパイルステップが必要ですが、IDEのオートコンプリート、シンボル名変更によるリファクタリング、コード内での型ドキュメントを提供します。
| 側面 | JavaScript | TypeScript |
|---|---|---|
| 型付け | 動的、ランタイム | 静的、コンパイル時 |
| ファイル拡張子 | .js | .ts(Reactは.tsx) |
| 型エラー | ランタイムで発見 | 実行前に発見 |
| ジェネリクス | なし | あり(Generic types) |
| インターフェース | なし(JSDocのみ) | あり(interface + type) |
| コンパイル | 不要 | 必要(tsc / Babel) |
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の基本型システム
// プリミティブ型
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オブジェクトにはインターフェースを、それ以外には型を使用します。
// 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のジェネリクス
// 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は、コンポーネントの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フックは完全に型付けされています。
// 型付けされた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はジェネリクスを介して型付けされます:
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が唯一の型ソースです。
// 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は、Microsoft(2012年)のJavaScriptの厳密に型付けされたスーパーセットです。静的型付け、インターフェース、ジェネリクス、列挙型、デコレータを追加。tscを介して純粋なJSにコンパイル。任意のJSコードと互換性があります。React Native(新規プロジェクトの約65%)、Angular、Node.jsで使用。Anders Hejlsberg(C#の生みの親)によって作成されました。
TypeScriptはReactコンポーネントのpropsとstateに厳格な型付けを提供します — 型エラーはランタイムではなくコンパイル時に捕捉されます。IDEのオートコンプリートはすべてのライブラリで機能します。ジェネリクスは複雑な構造(Redux store、API)を型付けします。React Navigationは完全なルート型付けを持っています。調査によると、JS開発者の78%がTypeScriptを使用しています。
tscコンパイラが.ts/.tsxファイルを解析し、型をチェックし、アノテーションを削除して.jsを生成します。ターゲット(ES5、ES2020)はtsconfig.jsonで設定します。TypeScriptはランタイムを変更しません — 消去された型はパフォーマンスに影響しません。ソースマップはデバッグ用にコンパイル済みJSを元のTSにリンクします。@babel/preset-typescriptを使用したBabelはtscの代替です。
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>。
tscコンパイラはtypescript npmパッケージに含まれています。VS Code — ネイティブTSサポート、オートコンプリート、リファクタリングを備えたIDE。tsconfig.jsonは厳格モードを設定。@typescript-eslint/parserを使用したESLint — 静的解析。Prettier — フォーマット。DefinitelyTyped(@types/*) — 組み込みサポートのないライブラリ用の型。React Native CLIにはTypeScriptテンプレートが含まれています。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。