TypeScript には 型推論(Type Inference) という強力な機能があり、明示的に型を指定しなくても TypeScript が適切な型を推測してくれます。
TypeScript には 型推論(Type Inference) という強力な機能があり、明示的に型を指定しなくても TypeScript が適切な型を推測してくれます。
また、複数の型を組み合わせる ユニオン型(Union Type) や インターセクション型(Intersection Type) を使うことで、柔軟な型定義が可能になります。
本記事では、それらの概念と使い方を詳しく解説します。
TypeScript では、明示的に型を指定しなくても、変数の初期値から 自動的に型を推測 します。
TYPESCRIPTlet message = "Hello, TypeScript!"; // message の型は string と推論される let age = 30; // age の型は number と推論される
message
や age
のように、初期値を代入した場合、TypeScript はその値の型を推論する ため、string
や number
を明示的に指定しなくても問題ありません。
TYPESCRIPTfunction add(a: number, b: number) { return a + b; }
この場合、戻り値の型は number
と推論されるため、明示的に : number
を指定しなくても動作します。
ユニオン型を使うと、複数の型を持つ変数を定義 できます。
TYPESCRIPTlet value: number | string; value = 42; // OK value = "Hello"; // OK // value = true; // エラー(boolean は許可されていない)
value
は number
または string
を格納できる変数として定義されています。
TYPESCRIPTfunction printId(id: number | string) { console.log(`ID: ${id}`); } printId(101); // OK printId("abc123"); // OK // printId(true); // エラー
ユニオン型を使うと、異なる型のデータを受け取る関数を柔軟に設計できます。
ユニオン型を使うとき、型に応じた適切な処理を行うために型ガード(Type Guard)を使用 します。
TYPESCRIPTfunction printLength(value: string | number) { if (typeof value === "string") { console.log(`文字列の長さ: ${value.length}`); } else { console.log(`数値: ${value}`); } } printLength("TypeScript"); // 文字列の長さ: 10 printLength(42); // 数値: 42
このように、typeof
を使うことで、ユニオン型の値に適切な処理を適用 できます。
インターセクション型は、複数の型を組み合わせて、新しい型を作る ために使用されます。
TYPESCRIPTinterface Person { name: string; } interface Employee { employeeId: number; } type EmployeeInfo = Person & Employee; const employee: EmployeeInfo = { name: "Alice", employeeId: 101, };
ここでは、Person
と Employee
を組み合わせた EmployeeInfo
型を定義し、
name
と employeeId
の両方を持つオブジェクトを作成しています。
オブジェクトの拡張に便利
TYPESCRIPTinterface Developer { skills: string[]; } interface Manager { teamSize: number; } type TechLead = Developer & Manager; const techLead: TechLead = { skills: ["TypeScript", "React"], teamSize: 5, };
このように、複数のインターフェースを組み合わせて、より詳細な型を定義 できます。
項目 | ユニオン型(|) | インターセクション型(&) |
---|---|---|
意味 | いずれかの型を持つ | すべての型を持つ |
使いどころ | 柔軟な入力を受け取る | 複数の型を統合する |
例 | number | string → number または string | Person & Employee → 両方のプロパティを持つ |
TYPESCRIPTtype A = { a: number }; type B = { b: string }; type UnionType = A | B; type IntersectionType = A & B; const u1: UnionType = { a: 10 }; // OK const u2: UnionType = { b: "hello" }; // OK const u3: UnionType = { a: 10, b: "hello" }; // OK const i1: IntersectionType = { a: 10, b: "hello" }; // OK // const i2: IntersectionType = { a: 10 }; // エラー(b がない)
ユニオン型は「どちらかの型が含まれていれば OK」、インターセクション型は「すべての型を持っていなければならない」違いがあります。
概念 | 説明 |
---|---|
型推論 | TypeScript が自動で型を推測する仕組み |
ユニオン型(|) | いずれかの型を持つ(例: number | string) |
インターセクション型(&) | すべての型を統合する(例: Person & Employee ) |
型ガード(Type Guard) | typeof を使ってユニオン型の型を判別する |
ユニオン型とインターセクション型を使いこなすことで、柔軟で安全な型定義が可能になります。
回 | タイトル | リンク |
---|---|---|
第 1 回 | TypeScript の基本概念 | 詳 細 |
第 2 回 | 基本的な型(number, string, boolean など) | 詳 細 |
第 3 回 | 配列とオブジェクトの型定義 | 詳 細 |
第 4 回 | 関数の型定義(引数・戻り値・コールバック) | 詳 細 |
第 5 回 | 型推論とユニオン型・インターセクション型 | この記事 |
第 6 回 | 型エイリアスとインターフェース | 詳 細 |
第 7 回 | 関数の型定義の応用 | 詳 細 |
第 8 回 | React / Next.js に TypeScript を導入 | 詳 細 |
第 9 回 | Next.js App Router に TypeScript を導入 | 詳 細 |
当サイトの情報は、一般的な参考情報として提供しております。
正確な情報の掲載に努めておりますが、その内容の正確性・完全性・最新性を保証するものではありません。
記事の内容をご利用の際は、ご自身の責任において判断し、必要に応じて専門家にご相談ください。
当サイトの情報の利用により生じたいかなる損害についても、一切の責任を負いかねますのでご了承ください。
※ 本ページでは、著作権法に基づき、適正な引用の範囲内でコンテンツを紹介しています。
オリジナルの情報は発信元をご確認ください。
もし問題がありましたら、こちら からお問い合わせください。