my.code(); Logomy.code();
TypeScript-2.オブジェクト、インターフェース、型エイリアス

my.code(); Logomy.code();

  • C++
    • 0.C++の世界へようこそ
    • 1.型システムと制御構造
    • 2.データ集合とモダンな操作
    • 3.ポインタとメモリ管理
    • 4.関数と参照渡し
    • 5.プロジェクトの分割とビルド
    • 6.クラスの基礎
    • 7.クラスを使いこなす
    • 8.継承とポリモーフィズム
    • 9.テンプレート
    • 10.STL ①:コンテナ
    • 11.STL ②:アルゴリズムとラムダ式
    • 12.RAIIとスマートポインタ
  • JavaScript
    • 0.JavaScriptへようこそ
    • 1.基本構文とデータ型
    • 2.制御構文
    • 3.関数とクロージャ
    • 4.'this'の正体
    • 5.オブジェクトとプロトタイプ
    • 6.クラス構文
    • 7.配列とイテレーション
    • 8.非同期処理①: Promise
    • 9.非同期処理②: Async/Await
  • Python
    • 0.環境構築と基本思想
    • 1.基本構文とデータ型
    • 2.リスト、タプル、辞書、セット
    • 3.制御構文と関数
    • 4.モジュールとパッケージ
    • 5.オブジェクト指向プログラミング
    • 6.ファイルの入出力とコンテキストマネージャ
    • 7.例外処理
    • 8.ジェネレータとデコレータ
  • Ruby
    • 0.rubyの世界へようこそ
    • 1.基本構文とデータ型
    • 2.制御構造とメソッド定義
    • 3.すべてがオブジェクト
    • 4.コレクション (Array, Hash, Range)
    • 5.ブロックとイテレータ
    • 6.クラスとオブジェクト
    • 7.モジュールとMix-in
    • 8.Proc, Lambda, クロージャ
    • 9.標準ライブラリの活用
    • 10.テスト文化入門
    • 11.メタプログラミング入門
  • Rust
    • 0.Rustの世界へようこそ
    • 1.基本構文と「不変性」
    • 2.関数と制御フロー
    • 3.所有権
    • 4.借用とスライス
    • 5.構造体とメソッド構文
    • 6.列挙型とパターンマッチ
    • 7.モジュールシステムとパッケージ管理
    • 8.コレクションと文字列
    • 9.エラーハンドリング
    • 10.ジェネリクスとトレイト
    • 11.ライフタイム
  • TypeScript
    • 0.TypeScriptへようこそ
    • 1.基本的な型と型推論
    • 2.オブジェクト、インターフェース、型エイリアス
    • 3.関数の型定義
    • 4.型を組み合わせる
    • 5.ジェネリクス
    • 6.クラスとアクセス修飾子
    • 7.非同期処理とユーティリティ型
my.code(); Logomy.code();

環境構築不要、その場で実践。

ut-code / my-code

Copyright © 2026 ut.code();

ut.code(); について
公式ウェブサイト公式 𝕏 アカウント

第2章: オブジェクト、インターフェース、型エイリアス

JavaScriptでは、オブジェクトはデータを扱うための中心的な存在です。TypeScriptにおいてもそれは変わりませんが、JavaScriptの自由度に「型」という制約を加えることで、開発時の安全性を劇的に高めることができます。

この章では、オブジェクトの形状(Shape)を定義するための主要な方法である型エイリアス(type)とインターフェース(interface)について学びます。

オブジェクトの型付け: インラインでの定義

最も基本的な方法は、変数宣言時に直接オブジェクトの構造(型)を記述する方法です。これを「インラインの型定義」や「オブジェクトリテラル型」と呼びます。

ファイルを編集:inline-object.ts
// 変数名の後ろに : { プロパティ名: 型; ... } を記述します
const book: { title: string; price: number; isPublished: boolean } = {
  title: "TypeScript入門",
  price: 2500,
  isPublished: true,
};

console.log(`Title: ${book.title}, Price: ${book.price}`);
npx tsc inline-object.ts && node inline-object.js
ブラウザ上で動作するTypeScriptの実行環境です。
左上の実行ボタンを押して、このページ内のinline-object.tsに書かれている内容を実行します。
Title: TypeScript入門, Price: 2500
出力されたファイル(編集不可):inline-object.js

この方法はシンプルですが、同じ構造を持つオブジェクトを複数作成する場合、毎回型定義を書く必要があり、コードが冗長になります。そこで登場するのが「型に名前を付ける」機能です。

型エイリアス (type): 型に名前を付ける

型エイリアス(Type Alias)を使用すると、特定の型定義に名前を付け、それを再利用することができます。JavaScriptの経験がある方にとって、これは「型の変数」を作るようなものだとイメージしてください。

キーワードは type です。慣習として型名には PascalCase(大文字始まり)を使用します。

ファイルを編集:type-alias.ts
// User型を定義
type User = {
  name: string;
  age: number;
  email: string;
};

// 定義したUser型を使用
const user1: User = {
  name: "Tanaka",
  age: 28,
  email: "tanaka@example.com",
};

const user2: User = {
  name: "Suzuki",
  age: 34,
  email: "suzuki@example.com",
};

// 関数の引数としても利用可能
function greet(user: User): string {
  return `Hello, ${user.name}!`;
}

console.log(greet(user1));
npx tsc type-alias.ts && node type-alias.js
ブラウザ上で動作するTypeScriptの実行環境です。
左上の実行ボタンを押して、このページ内のtype-alias.tsに書かれている内容を実行します。
Hello, Tanaka!
出力されたファイル(編集不可):type-alias.js

インターフェース (interface): オブジェクトの「形状」を定義する

オブジェクトの構造を定義するもう一つの代表的な方法が インターフェース(interface) です。 JavaやC#などの言語経験がある方には馴染み深いキーワードですが、TypeScriptのインターフェースは「クラスのための契約」だけでなく、「純粋なオブジェクトの形状定義」としても頻繁に使用されます。

ファイルを編集:interface-basic.ts
// interfaceキーワードを使用(= は不要)
interface Car {
  maker: string;
  model: string;
  year: number;
}

const myCar: Car = {
  maker: "Toyota",
  model: "Prius",
  year: 2023,
};

console.log(`${myCar.maker} ${myCar.model} (${myCar.year})`);
npx tsc interface-basic.ts && node interface-basic.js
ブラウザ上で動作するTypeScriptの実行環境です。
左上の実行ボタンを押して、このページ内のinterface-basic.tsに書かれている内容を実行します。
Toyota Prius (2023)
出力されたファイル(編集不可):interface-basic.js

type vs interface: 使い分けの基本的なガイドライン

「type と interface のどちらを使うべきか?」は、TypeScriptにおける最大の論点の一つです。 現在のTypeScriptでは機能的な差は非常に少なくなっていますが、基本的な使い分けのガイドラインは以下の通りです。

特徴type (型エイリアス)interface (インターフェース)
主な用途プリミティブ、ユニオン型(第5章で解説)、タプル、関数の型など、あらゆる型に名前を付ける。オブジェクトの構造やクラスの実装ルールを定義する。
拡張性交差型 (&) を使って拡張する。extends キーワードで継承できる。また、同名のinterfaceを定義すると自動でマージされる(Declaration Merging)。
推奨シーンアプリケーション開発全般、複雑な型の組み合わせ。ライブラリ開発(拡張性を残すため)、オブジェクト指向的な設計。

結論としての指針: 初心者のうちは、「オブジェクトの定義には interface、それ以外(単純な型や複雑な型の合成)には type」 というルールで始めるのが無難です。 あるいは、最近のトレンドとして「一貫して type を使う」というチームも増えています。重要なのはプロジェクト内で統一することです。

オプショナルなプロパティ (?)

オブジェクトによっては、特定のプロパティが存在しない(省略可能である)場合があります。 プロパティ名の後ろに ? を付けることで、そのプロパティを オプショナル(任意) に設定できます。

ファイルを編集:optional-properties.ts
interface UserProfile {
  username: string;
  avatarUrl?: string; // ? があるので、このプロパティはなくてもエラーにならない
}

const profileA: UserProfile = {
  username: "user_a",
  avatarUrl: "https://example.com/a.png",
};

const profileB: UserProfile = {
  username: "user_b",
  // avatarUrl は省略可能
};

console.log(profileA);
console.log(profileB);
npx tsc optional-properties.ts && node optional-properties.js
ブラウザ上で動作するTypeScriptの実行環境です。
左上の実行ボタンを押して、このページ内のoptional-properties.tsに書かれている内容を実行します。
{ username: 'user_a', avatarUrl: 'https://example.com/a.png' }
{ username: 'user_b' }
出力されたファイル(編集不可):optional-properties.js

この場合、avatarUrl の型は実質的に string | undefined(文字列 または undefined)として扱われます。

読み取り専用プロパティ (readonly)

オブジェクトのプロパティを初期化した後に変更されたくない場合、readonly 修飾子を使用します。これは特に、IDや設定値など、不変であるべきデータを扱う際に有用です。

ファイルを編集:readonly-properties.ts
type Product = {
  readonly id: number; // 書き換え不可
  name: string;        // 書き換え可能
  price: number;
};

const item: Product = {
  id: 101,
  name: "Laptop",
  price: 98000
};

item.price = 95000; // OK: 通常のプロパティは変更可能

// 以下の行はコンパイルエラーになります
// item.id = 102; // Error: Cannot assign to 'id' because it is a read-only property.

console.log(item);
npx tsc readonly-properties.ts && node readonly-properties.js
ブラウザ上で動作するTypeScriptの実行環境です。
左上の実行ボタンを押して、このページ内のreadonly-properties.tsに書かれている内容を実行します。
{ id: 101, name: 'Laptop', price: 95000 }
出力されたファイル(編集不可):readonly-properties.js

注意点として、readonly はあくまで TypeScript のコンパイル時のチェックです。実行時の JavaScript コードでは通常のオブジェクトとして振る舞うため、無理やり書き換えるコードが混入すると防げない場合があります(ただし、TSを使っている限りはその前にエラーで気づけます)。

この章のまとめ

  • インライン定義: { key: type } でその場限りの型定義が可能。
  • 型エイリアス (type): 型定義に名前を付けて再利用しやすくする。柔軟性が高い。
  • インターフェース (interface): オブジェクトの構造を定義することに特化している。
  • オプショナル (?): プロパティを必須ではなく任意にする。
  • 読み取り専用 (readonly): プロパティの再代入を禁止し、不変性を保つ。

練習問題 1: 商品在庫管理

以下の条件を満たす Item インターフェースを定義し、そのオブジェクトを作成してください。

  1. id は数値で、読み取り専用 (readonly) であること。
  2. name は文字列であること。
  3. price は数値であること。
  4. description は文字列だが、省略可能 (?) であること。
  5. 作成したオブジェクトの price を変更し、コンソールに出力してください。
ファイルを編集:practice3_1.ts
npx tsc practice3_1.ts && node practice3_1.js
ブラウザ上で動作するTypeScriptの実行環境です。
左上の実行ボタンを押して、このページ内のpractice3_1.tsに書かれている内容を実行します。
出力されたファイル(編集不可):practice3_1.js

練習問題 2: ユーザー情報の統合

以下の2つの型エイリアスを定義してください。

  1. Contact: email (string) と phone (string) を持つ。
  2. Employee: id (number), name (string), contact (Contact型) を持つ。
    • つまり、Employee の中に Contact 型がネスト(入れ子)されている状態です。
  3. この Employee 型を使って、あなたの情報を表現する変数を作成してください。
ファイルを編集:practice3_2.ts
npx tsc practice3_2.ts && node practice3_2.js
ブラウザ上で動作するTypeScriptの実行環境です。
左上の実行ボタンを押して、このページ内のpractice3_2.tsに書かれている内容を実行します。
出力されたファイル(編集不可):practice3_2.js
前のページ« 基本的な型と型推論
次のページ関数の型定義 »