TypeScriptの型システムを活用することで、コードの柔軟性と安全性を向上させることができます。このセクションでは、ユニオン型と交差型、型エイリアス、型ガード、Nullableな型の扱いについて学んでいきます。
ユニオン型と交差型
ユニオン型
ユニオン型は、複数の型のうちのいずれかの型を持つことを示します。これにより、変数に複数の異なる型の値を割り当てることができます。
typescript
let value: string | number;
value = "Hello"; // OK
value = 42; // OK
// value = true; // エラー: 'boolean' 型は許可されていません
上記の例では、value
はstring
またはnumber
型のいずれかを持つことができます。これにより、柔軟なデータの取り扱いが可能になります。
交差型
交差型は、複数の型を組み合わせて1つの型を作ることができます。交差型は、すべての型のプロパティを含むオブジェクトを扱う場合に使います。
typescript
interface Person {
name: string;
age: number;
}
interface Employee {
employeeId: number;
}
type Worker = Person & Employee;
let worker: Worker = {
name: "Alice",
age: 30,
employeeId: 1234,
};
この例では、Person
とEmployee
の両方を持つWorker
型を作成しています。worker
は両方のインターフェースのプロパティを持つ必要があります。
型エイリアス
型エイリアスを使うことで、複雑な型定義に対して別名を付け、コードを簡潔で読みやすくできます。型エイリアスはtype
キーワードを使って定義します。
typescript
type Point = {
x: number;
y: number;
};
let p1: Point = { x: 10, y: 20 };
この例では、Point
という型エイリアスを定義しています。これにより、Point
型を使って簡潔に座標を表現することができます。
ユニオン型や交差型にも型エイリアスを使うことができます。
typescript
type StringOrNumber = string | number;
let value: StringOrNumber;
value = "Hello";
value = 42;
型ガード
型ガードは、ユニオン型などで異なる型のデータを扱う際に、実際の型を特定して適切な処理を行うために使用されます。typeof
やinstanceof
を使って型を判別することが一般的です。
typescript
function printValue(value: string | number): void {
if (typeof value === "string") {
console.log(`文字列の値: ${value}`);
} else if (typeof value === "number") {
console.log(`数値の値: ${value}`);
}
}
printValue("Hello"); // 文字列の値: Hello
printValue(100); // 数値の値: 100
また、オブジェクトの型を判別する場合はinstanceof
を使います。
typescript
class Dog {
bark() {
console.log("Woof!");
}
}
class Cat {
meow() {
console.log("Meow!");
}
}
function makeSound(animal: Dog | Cat): void {
if (animal instanceof Dog) {
animal.bark();
} else if (animal instanceof Cat) {
animal.meow();
}
}
let dog = new Dog();
let cat = new Cat();
makeSound(dog); // Woof!
makeSound(cat); // Meow!
Nullableな型の扱い
TypeScriptでは、変数にnull
やundefined
が代入される可能性がある場合に、それを明示的に扱うことができます。これにより、null
やundefined
によるエラーを防ぐことができます。
typescript
let value: string | null = null;
value = "Hello";
function greet(name: string | null): void {
if (name === null) {
console.log("Hello, Guest!");
} else {
console.log(`Hello, ${name}!`);
}
}
greet(null); // Hello, Guest!
greet("Alice"); // Hello, Alice!
--strictNullChecks
オプションを有効にすることで、null
やundefined
の扱いを厳密に管理できます。このオプションが有効な場合、null
やundefined
を代入する可能性がある変数には明示的に型を指定しなければなりません。
typescript
let value: string | undefined;
value = undefined;
value = "Hello";
まとめ
TypeScriptの型システムを活用することで、コードの柔軟性と安全性を向上させることができます。ユニオン型や交差型を使うことで柔軟な型定義ができ、型エイリアスを使うことでコードを簡潔にできます。型ガードによってユニオン型の実際の型を特定し、Nullableな型の扱いでnull
やundefined
によるエラーを防ぐことが可能です。これらの応用的な型の使い方をマスターすることで、より堅牢で読みやすいコードを書くことができるようになります。