Blog Article
TypeScriptの基本構文をまとめてみた

TypeScriptとは?
TypeScript(タイプスクリプト) は、JavaScriptのスーパーセットです。
「スーパーセット」って何?と思いますよね。簡単に言うと、「JavaScriptの機能をすべて含んで、さらに便利な機能を追加したプログラミング言語」のことです。
TypeScriptの最大の特徴は 「静的型付け」 です。これも難しく聞こえますが、要は「変数にどんな種類のデータが入るかを事前に決められる」ということです。
具体例で理解しよう
JavaScriptの場合:
let userName = "田中太郎";
userName = 123; // これでもエラーにならない(でも混乱の元)
TypeScriptの場合:
let userName: string = "田中太郎";
userName = 123; // エラー!「文字列のはずなのに数字を入れようとしてる」と教えてくれる
このように、TypeScriptは「間違い」を事前に教えてくれるので、バグの少ない安全なコードを書けるようになります。
JavaScriptとの違いを詳しく見てみよう
1. 型システムの違い
JavaScript(動的型付け)
- 変数にどんな種類のデータでも自由に入れられる
- 実行してみるまでエラーに気づかない
let price = 1000;
price = "千円"; // 実行時まで問題に気づけない
console.log(price * 1.1); // NaN(計算できない)になる
TypeScript(静的型付け)
- 変数にどんなデータが入るかを最初に決める
- コードを書いている段階でエラーを教えてくれる
let price: number = 1000;
price = "千円"; // すぐにエラー表示!「数値じゃないよ」と教えてくれる
console.log(price * 1.1); // 安全に計算できる
2. 実行方法の違い
JavaScript
- そのままブラウザやNode.jsで実行できる
TypeScript
- 直接実行はできない
- まずJavaScriptに変換(コンパイル)してから実行する
- この変換の時に型チェックが行われる
イメージとしては:
TypeScriptコード → コンパイル → JavaScriptコード → 実行
↑
ここでエラーチェック
開発環境をセットアップしよう
前提条件
まず、Node.jsがインストールされているか確認しましょう。Node.jsは、ブラウザの外でJavaScriptを実行できる環境です。
node -v
バージョンが表示されればOKです。
必要なパッケージをインストール
以下のコマンドを実行して、TypeScriptの開発に必要なツールをインストールします:
npm i -D typescript ts-node ts-node-dev
それぞれのツールの役割:
typescript
- TypeScriptのコンパイラ(tsc)を提供
- TypeScriptコードをJavaScriptに変換するためのツール
- 型エラーを検出してくれる
ts-node
- TypeScriptファイルを直接実行できるツール
- 通常は「TypeScript → JavaScript変換 → 実行」だが、これを1ステップで実行
- 開発中のテスト実行に便利
ts-node-dev
- ts-nodeの進化版
- ファイルを変更すると自動で再実行してくれる
- 開発効率が大幅にアップ
-D オプション
- 「開発時だけ必要」という意味
- 実際のアプリには含まれない(本番環境には不要)
TypeScriptの基本構文を覚えよう
文字列(string型)
文字列を扱うときは string
型を使います。
const greeting: string = "こんにちは";
console.log(greeting); // "こんにちは" と表示
// 型を指定することで、間違いを防げる
const message: string = "今日は晴れです";
// message = 123; // エラー!文字列じゃないよと教えてくれる
ポイント: const greeting: string
の部分で「この変数には文字列しか入らない」と宣言しています。
数値(number型)
数値を扱うときは number
型を使います。
const age: number = 28;
const price: number = 1980;
const temperature: number = -5.5; // 小数点や負の数もOK
console.log(age); // 28
console.log(price * 1.1); // 2178(税込計算)
真偽値(boolean型)
true(真)またはfalse(偽)を扱うときは boolean
型を使います。
const isActive: boolean = true;
const isCompleted: boolean = false;
// 実際の使用例
const hasPermission: boolean = true;
if (hasPermission) {
console.log("アクセス許可されています");
} else {
console.log("アクセス拒否されました");
}
配列(Array型)
複数のデータをまとめて管理したいときは配列を使います。
数値の配列:
const scores: number[] = [85, 92, 78, 95];
console.log(scores[0]); // 85(最初の要素)
console.log(scores.length); // 4(要素数)
// 平均点を計算
const average = scores.reduce((sum, score) => sum + score, 0) / scores.length;
console.log(`平均点: ${average}点`); // 平均点: 87.5点
文字列の配列:
const fruits: string[] = ["りんご", "バナナ", "オレンジ"];
console.log(fruits); // ["りんご", "バナナ", "オレンジ"]
// 配列に新しい要素を追加
fruits.push("ぶどう");
console.log(fruits); // ["りんご", "バナナ", "オレンジ", "ぶどう"]
タプル(tuple型)
タプルは「決められた順序で、異なる型のデータを組み合わせる」データ構造です。
// [名前, 年齢] の組み合わせ
const person: [string, number] = ["田中太郎", 25];
console.log(`名前: ${person[0]}, 年齢: ${person[1]}歳`); // 名前: 田中太郎, 年齢: 25歳
// [成功/失敗, メッセージ] の組み合わせ
const result: [boolean, string] = [true, "処理が完了しました"];
if (result[0]) {
console.log(result[1]); // "処理が完了しました"
}
タプルと配列の違い:
- 配列:同じ型のデータを複数
- タプル:異なる型のデータを決められた順序で
インターフェース(interface)
インターフェースは「オブジェクトの形(設計図)」を定義します。
// ユーザー情報の設計図を作成
interface User {
name: string; // 名前(文字列)
age: number; // 年齢(数値)
email: string; // メールアドレス(文字列)
}
// 設計図に従ってオブジェクトを作成
const user1: User = {
name: "山田花子",
age: 30,
email: "hanako@example.com"
};
// 関数でも使える
function showUserInfo(user: User) {
console.log(`名前: ${user.name}`);
console.log(`年齢: ${user.age}歳`);
console.log(`メール: ${user.email}`);
}
showUserInfo(user1);
// 名前: 山田花子
// 年齢: 30歳
// メール: hanako@example.com
インターフェースの利点:
- オブジェクトの構造が明確になる
- プロパティの入力ミスを防げる
- チーム開発で「この形で作ってね」と共有できる
戻り値がない関数(void型)
「何かを実行するけど、結果は返さない」関数には void
型を使います。
function showWelcomeMessage(): void {
console.log("ようこそ!");
console.log("サービスをご利用いただき、ありがとうございます。");
// return文がない(何も返さない)
}
function saveUserData(userData: User): void {
console.log("ユーザーデータを保存中...");
// データベースに保存する処理(仮)
console.log("保存完了!");
}
showWelcomeMessage(); // メッセージが表示されるだけ
未定義(undefined型)
変数が「まだ値を持っていない状態」を表します。
let userName: string | undefined; // 文字列またはundefined
console.log(userName); // undefined(まだ何も代入されていない)
// 後で値を設定
userName = "佐藤太郎";
console.log(userName); // "佐藤太郎"
// 実際の使用例:初期化前のチェック
function greetUser(name: string | undefined) {
if (name === undefined) {
console.log("ゲストさん、こんにちは!");
} else {
console.log(`${name}さん、こんにちは!`);
}
}
greetUser(undefined); // "ゲストさん、こんにちは!"
greetUser("田中"); // "田中さん、こんにちは!"
オブジェクト型(object型)
「文字列、数値、真偽値以外」のデータを扱うときに使います。
const userInfo: object = {
name: "鈴木一郎",
age: 25,
hobbies: ["読書", "映画鑑賞"]
};
const todoList: object = ["買い物", "掃除", "勉強"];
// 関数もobject型
const calculator: object = function(a: number, b: number) {
return a + b;
};
注意: object
型は「何でも入れられる箱」なので、具体的な構造が分かりません。実際の開発では、インターフェースを使う方が安全です。
型エイリアス(Type Alias)
「型に分かりやすい名前を付ける」機能です。
// IDは数値だけど、「UserID」という名前を付けて分かりやすく
type UserID = number;
type ProductID = number;
const currentUser: UserID = 12345;
const selectedProduct: ProductID = 67890;
// 関数で使用
function getUserProfile(id: UserID): string {
return `ユーザーID ${id} のプロフィールを取得中...`;
}
function getProductInfo(id: ProductID): string {
return `商品ID ${id} の情報を取得中...`;
}
console.log(getUserProfile(currentUser));
console.log(getProductInfo(selectedProduct));
実用的な例:
// ステータスコードに名前を付ける
type StatusCode = 200 | 404 | 500;
function handleResponse(status: StatusCode): string {
switch(status) {
case 200:
return "成功しました!";
case 404:
return "ページが見つかりません";
case 500:
return "サーバーエラーが発生しました";
}
}
console.log(handleResponse(200)); // "成功しました!"
unknown型
unknown
は「何の型か分からないけど、安全に使いたい」ときに使います。
function processApiResponse(): unknown {
// 外部APIからのレスポンス(何が返ってくるか分からない)
return { status: "success", data: [1, 2, 3] };
}
let response: unknown = processApiResponse();
// そのまま使おうとするとエラー
// console.log(response.status); // エラー!
// 型チェックしてから使う
if (typeof response === "object" && response !== null) {
console.log("オブジェクトが返されました");
// さらに詳細なチェックが必要
}
// 実用的な例
function safeParseJSON(jsonString: string): unknown {
try {
return JSON.parse(jsonString);
} catch {
return null;
}
}
const parsed = safeParseJSON('{"name": "太郎", "age": 20}');
if (typeof parsed === "object" && parsed !== null) {
console.log("JSONの解析に成功しました");
}
ユニオン型(|)
「AまたはB」のように、複数の型を許可したいときに使います。
// 基本的な使い方
type Status = "loading" | "success" | "error";
function showStatus(status: Status): void {
switch(status) {
case "loading":
console.log("読み込み中...");
break;
case "success":
console.log("完了しました!");
break;
case "error":
console.log("エラーが発生しました");
break;
}
}
showStatus("loading"); // "読み込み中..."
// showStatus("pending"); // エラー!許可されていない値
実用的な例:
// ユーザーの権限管理
type UserRole = "admin" | "moderator" | "member";
interface User {
name: string;
role: UserRole;
}
function checkPermission(user: User): boolean {
if (user.role === "admin") {
console.log("すべての機能を利用できます");
return true;
} else if (user.role === "moderator") {
console.log("一部の管理機能を利用できます");
return true;
} else {
console.log("基本機能のみ利用できます");
return false;
}
}
const admin: User = { name: "管理者", role: "admin" };
const member: User = { name: "一般ユーザー", role: "member" };
checkPermission(admin); // すべての機能を利用できます
checkPermission(member); // 基本機能のみ利用できます
文字列または数値を受け取る関数:
function formatDisplay(value: string | number): string {
if (typeof value === "string") {
return `テキスト: ${value.toUpperCase()}`; // 文字列なら大文字に
} else {
return `数値: ${value.toFixed(2)}`; // 数値なら小数点以下2桁に
}
}
console.log(formatDisplay("hello")); // "テキスト: HELLO"
console.log(formatDisplay(3.14159)); // "数値: 3.14"
console.log(formatDisplay(100)); // "数値: 100.00"
まとめ
TypeScriptは最初は難しく感じるかもしれませんが、以下のメリットがあります:
- エラーを早期発見 - コードを書いている時点で間違いを教えてくれる
- コードの意図が明確 - どんなデータを扱うかが一目で分かる
- チーム開発に有利 - みんなが同じルールでコードを書ける
- リファクタリングが安全 - コードの変更時に影響範囲が分かる
まずは基本的な型(string
, number
, boolean
)から始めて、徐々に複雑な機能を覚えていきましょう。
実際にコードを書きながら練習することで、TypeScriptの便利さを実感できるはずです!
コメント
ログインしてコメントしましょう。