MochiuWiki : SUSE, EC, PCB
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
TypeScriptの基礎 - 型エイリアスのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
TypeScriptの基礎 - 型エイリアス
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == TypeScriptの型エイリアス (Type Alias) とは、<code>type</code> キーワードを使用して既存の型に別名を付ける機能である。<br> 型エイリアスは新しい型を生成するのではなく、既存の型への参照に名前を付けることで、コードの可読性と再利用性を向上させる。<br> <br> TypeScript 5.x系以降では、型エイリアスの活用範囲が大幅に拡大しており、以下に示すような型操作が可能になっている。<br> <br> <center> {| class="wikitable" |+ typeキーワードの主な用途 ! 用途 !! 説明 |- | 基本的な型エイリアス || プリミティブ型、ユニオン型、オブジェクト型に別名を付けて一貫した型定義を維持する。 |- | 交差型 (<code>&</code>) || 複数の型を結合して全プロパティを持つ型を生成する。 |- | Conditional Types || <code>T extends U ? X : Y</code> の構文で型の条件分岐を表現し、型レベルのロジックを実装できる。 |- | Mapped Types || 既存の型からプロパティを動的に変換した新しい型を生成する。<br>(<code>Partial</code>、<code>Pick</code>、<code>Omit</code> 等のユーティリティ型もこの仕組みで実装されている) |- | Template Literal Types || 文字列リテラル型のパターンベース推論を可能にし、URLパスやイベント名等の型安全な文字列定義に活用できる。 |} </center> <br> TypeScript 4.9で導入された <code>satisfies</code> 演算子と型エイリアスを組み合わせることにより、型安全性を保ちながら値の具体的な型情報を保持できる。<br> <br> <code>interface</code> との使い分けとしては、オブジェクト型の定義には <code>interface</code> を使用し、<br> ユニオン型、タプル型、プリミティブ型のエイリアス等には <code>type</code> を使用するのが一般的な指針である。<br> <br> 2026年2月時点でTypeScript 5.9が安定版としてリリースされている。<br> TypeScript 6.0ベータでは <code>strict: true</code> のデフォルト化等の変更が行われており、Go言語で書き直されるTypeScript 7.0では最大10倍のコンパイル速度向上が見込まれている。<br> <br> オブジェクト型とインターフェースの詳細については、[[TypeScriptの基礎 - オブジェクト型とインターフェース]]のページを参照すること。<br> <br><br> == typeによる型定義 == <code>type</code> キーワードは、任意の型に対して別名を定義するために使用する。<br> <br> プリミティブ型からオブジェクト型、ユニオン型、関数型まで、あらゆる型に対して型エイリアスを作成できる。<br> <br> ==== 基本的な構文 ==== 型エイリアスの基本構文は以下の通りである。<br> <br> <syntaxhighlight lang="typescript"> type <型名> = <型記述>; </syntaxhighlight> <br> 型名は <u>PascalCase (先頭大文字)</u> で命名することが慣例である。<br> 一度定義した型エイリアスは、型注釈が必要なあらゆる箇所で使用できる。<br> <br> 同じ名前で型エイリアスを再宣言することはできない。<br> <br> <syntaxhighlight lang="typescript"> type User = { name: string }; type User = { email: string }; // エラー: Duplicate identifier 'User'. </syntaxhighlight> <br> ==== プリミティブ型とユニオン型のエイリアス ==== プリミティブ型に型エイリアスを付与することにより、型の意味をコードで明示できる。<br> <br> * プリミティブ型のエイリアス *: <syntaxhighlight lang="typescript"> type ID = string; type Age = number; type IsActive = boolean; function getUserId(): ID { return "user-123"; } </syntaxhighlight> *: <br> * ユニオン型に型エイリアスを付与する例 *: <syntaxhighlight lang="typescript"> type StringOrNumber = number | string; type Status = "pending" | "completed" | "failed"; type HttpMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH"; </syntaxhighlight> <br> 複数の文字列リテラルを縦に並べる書き方も可能である。<br> これはリテラルの数が多い場合に可読性が向上する。<br> <br> <syntaxhighlight lang="typescript"> type FileFormat = | "json" | "xml" | "csv" | "yaml"; </syntaxhighlight> <br> 判別ユニオン型 (Discriminated Union) は、共通のリテラル型プロパティを持つユニオン型である。<br> TypeScriptはそのプロパティの値によって型を絞り込むことができる。<br> <br> <syntaxhighlight lang="typescript"> type Result = { success: true; data: string } | { success: false; error: string }; function handleResult(result: Result) { if (result.success) { console.log(result.data); // success が true の場合は data にアクセス可能 } else { console.log(result.error); // success が false の場合は error にアクセス可能 } } </syntaxhighlight> <br> 判別ユニオン型の型絞り込みの詳細は、[[TypeScriptの基礎 - 型の絞り込み]]のページを参照すること。<br> <br> ==== オブジェクト型のエイリアス ==== オブジェクトの構造を型エイリアスとして定義することにより、複数の箇所で同じ型定義を再利用できる。<br> <br> * 基本的なオブジェクト型のエイリアスの例 *: <syntaxhighlight lang="typescript"> type User = { id: string; name: string; email: string; age: number; }; type Product = { id: number; title: string; price: number; inStock: boolean; tags?: string[]; // ?を付けることでオプショナルプロパティになる }; </syntaxhighlight> *: <br> * オブジェクト型はネストして定義することも可能である。 *: <syntaxhighlight lang="typescript"> type Address = { street: string; city: string; country: string; }; type Customer = { name: string; address: Address; // 別の型エイリアスを参照する phone: string; }; </syntaxhighlight> *: <br> * インデックスシグネチャを使用すると、任意のキー名を持つオブジェクト型を定義できる。 *: 以下の例では、ジェネリクス型パラメータ <code>T</code> を使用して、値の型を柔軟に変更できる汎用的な辞書型を定義している。 *: <syntaxhighlight lang="typescript"> type Dictionary<T> = { [key: string]: T; }; type NumberDict = Dictionary<number>; const scores: NumberDict = { Alice: 90, Bob: 85, Carol: 92, }; </syntaxhighlight> <br><br> == 交差型 (&) == 交差型 (Intersection Type) は、複数の型を <code>&</code> で結合し、全ての型のプロパティを持つ単一の型を作成する機能である。<br> <br> <code>type</code> による型エイリアスと組み合わせて使用することが多い。<br> <br> ==== 基本的な使用方法 ==== 交差型の基本構文は以下の通りである。<br> <br> <syntaxhighlight lang="typescript"> type Combined = Type1 & Type2; </syntaxhighlight> <br> 交差型を使用すると、<u>Type1</u> と <u>Type2</u> の両方のプロパティを持つ型が作成される。<br> どちらの型のプロパティが欠けていてもコンパイルエラーとなる。<br> <br> プロパティ同士が競合する場合、そのプロパティの型は両方の型を満たす必要があるため、<code>never</code> 型になることがある。<br> <br> <syntaxhighlight lang="typescript"> type A = { x: 1 }; type B = { x: 2 }; type C = A & B; // Cは { x: never } となる (1 かつ 2を満たす値は存在しない) </syntaxhighlight> <br> <u>プロパティの型が競合する場合の交差型は実質使用不可能な型になるため、設計時に注意が必要である。</u><br> <br> ==== オブジェクト型の合成 ==== 交差型は、複数の独立した型を組み合わせて新しい複合型を作成する場面で活用する。<br> <br> <syntaxhighlight lang="typescript"> type BusinessPartner = { businessName: string; registrationNumber: string; }; type Contact = { email: string; phone: string; }; type Identity = { firstName: string; lastName: string; }; // 3つの型を合成する type Customer = BusinessPartner & Contact & Identity; const customer: Customer = { businessName: "Acme Inc", registrationNumber: "12345", email: "info@acme.com", phone: "+1-555-1234", firstName: "John", lastName: "Doe", }; </syntaxhighlight> <br> <u>上記の例のように、役割ごとに分割した型を交差型で合成することにより、型定義の責務を明確に分離できる。</u><br> <u>各部品型は独立して再利用可能であるため、保守性も向上する。</u><br> <br> 交差型 と <code>interface</code> の <code>extends</code> は似た役割を持つが、以下の点で異なる。<br> <br> <center> {| class="wikitable" |+ 交差型 と interfaceのextends の違い ! 方法 !! 説明 |- | interfaceのextends || コンパイラがキャッシュするため高速に処理される。 |- | typeの<code>&</code> || 使用のたびに計算が行われる可能性がある。 |} </center> <br> <u>パフォーマンスを重視する場面では、<code>interface</code> の <code>extends</code> の使用を検討する。</u><br> <br><br> == interfaceとtypeの違い == TypeScriptでオブジェクト型を定義する方法として、<code>interface</code> と <code>type</code> の両方が使用できる。<br> <br> どちらも似た用途で使用できるが、機能に違いがあるため、適切に使い分けることが重要である。<br> <br> ==== 機能比較 ==== 下表に、<code>interface</code> と <code>type</code> の主な機能の違いを示す。<br> <br> <center> {| class="wikitable" |+ interface と type の機能比較 ! 機能 !! type !! interface |- | Declaration Merging (宣言マージ) || 不可 || 可能 |- | 継承 (<code>extends</code>) || 不可 (<code>&</code> を使用) || 可能 |- | プリミティブ型の定義 || 可能 || 不可 |- | ユニオン型の定義 || 可能 || 不可 |- | タプル型の定義 || 可能 || 不可 |- | Mapped Types || 可能 || 不可 |- | Conditional Types || 可能 || 不可 |} </center> <br> Declaration Mergingとは、同じ名前の <code>interface</code> を複数回宣言した場合に自動的にマージされる機能である。<br> <br> <syntaxhighlight lang="typescript"> // interface は同名宣言で自動マージされる interface User { name: string; } interface User { email: string; } // 結果: { name: string; email: string; } と同等 </syntaxhighlight> <br> <code>type</code> では同名の再宣言はコンパイルエラーとなる。<br> <br> <syntaxhighlight lang="typescript"> type User = { name: string }; type User = { email: string }; // エラー : Duplicate identifier 'User'. </syntaxhighlight> <br> 継承の構文の違いを以下に示す。<br> <br> <syntaxhighlight lang="typescript"> // interface による継承 interface Animal { name: string; } interface Dog extends Animal { breed: string; } // typeによる継承 (交差型を使用) type Animal = { name: string }; type Dog = Animal & { breed: string }; </syntaxhighlight> <br> どちらの方法でも、Dog型はnameとbreedの両方のプロパティを持つ。<br> <br> ==== 使い分けの指針 ==== <code>interface</code> と <code>type</code> の一般的な使い分けの指針を以下に示す。<br> <br> <center> {| class="wikitable" |+ typeとinterfaceの使い分け ! 区分 !! 場面 !! 説明 |- | rowspan="4" | <code>type</code> を使用する場面 | ユニオン型やインターセクション型を定義する場合 || <u>type Status = "pending" | "completed" | "failed";</u> のような型は <code>type</code> でのみ定義できる |- | プリミティブ型にエイリアスを付与する場合 || <u>type ID = string;</u> のようなプリミティブ型への別名 |- | タプル型を定義する場合 || <u>type Pair = [string, number];</u> のような固定長の配列型 |- | Mapped TypesやConditional Typesを使用する場合 || ジェネリクスを活用した高度な型定義 |- | rowspan="3" | <code>interface</code> を使用する場面 | オブジェクトの構造を定義する場合 || クラスのメンバや関数の引数の構造を表す型定義 |- | クラスが実装する契約 (implements) を定義する場合 || <u>class MyClass implements MyInterface</u> のような使い方 |- | Declaration Mergingが必要な場合 || ライブラリの型定義を拡張する場面等 |} </center> <br> <u>一般的な指針として、オブジェクト型にはinterfaceを使用し、それ以外の型 (ユニオン型、プリミティブ型のエイリアス、タプル型等) には <code>type</code> を使用することが推奨される。</u><br> <br> 重要なのは一貫したルールをプロジェクト全体で統一して運用することである。<br> <br><br> == 関連情報 == * [[TypeScriptの基礎 - tsconfig.json]] * [[TypeScriptの基礎 - 型注釈とプリミティブ型]] * [[TypeScriptの基礎 - 型推論]] * [[TypeScriptの基礎 - オブジェクト型とインターフェース]] * [[TypeScriptの基礎 - 関数の型定義]] <br><br> {{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux |image=/resources/assets/MochiuLogo_Single_Blue.png }} __FORCETOC__ [[カテゴリ:Rust]][[カテゴリ:Web]]
TypeScriptの基礎 - 型エイリアス
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse