TypeScript の和集合型と積集合型

TypeScript は、より安全で予測可能なコードの作成に役立つ強力な型システム機能を提供します。これらの機能には、複雑な型の定義と管理を柔軟に行うための共用体型と交差型があります。この記事では、これらの概念を紹介し、使用例を示します。

ユニオン型とは何ですか?

ユニオン型を使用すると、変数に異なる型の値を保持できます。これは、複数の型のいずれかになる可能性のある値を表現する必要がある場合に便利です。ユニオン型は、| (パイプ) 記号を使用して表されます。

ユニオン型の定義

ユニオン型を定義するには、| シンボルで区切られた複数の型を指定します。

let value: string | number;

value = "Hello, TypeScript"; // Valid
value = 42; // Valid
value = true; // Error: Type 'boolean' is not assignable to type 'string | number'

この例では、変数 valuestring または number のいずれかになりますが、boolean にはなりません。

関数内でのユニオン型の使用

ユニオン型は、パラメータまたは戻り値の型が複数の型になる可能性がある関数で特に便利です。

function formatValue(value: string | number): string {
  if (typeof value === "string") {
    return value.toUpperCase();
  } else {
    return value.toFixed(2);
  }
}

console.log(formatValue("hello")); // Output: HELLO
console.log(formatValue(123.456)); // Output: 123.46

formatValue 関数は、string または number のいずれかのパラメータを受け取り、それに応じてフォーマットします。

交差点の種類とは何ですか?

交差型を使用すると、複数の型を 1 つに組み合わせることができます。つまり、交差型の値は、交差内のすべての型を満たすことになります。交差型は、& (アンパサンド) 記号を使用して表されます。

交差点タイプの定義

交差タイプを定義するには、& シンボルで区切られた複数のタイプを指定します。

interface Person {
  name: string;
}

interface Employee {
  employeeId: number;
}

type EmployeePerson = Person & Employee;

const john: EmployeePerson = {
  name: "John Doe",
  employeeId: 1234
};

console.log(john.name); // Output: John Doe
console.log(john.employeeId); // Output: 1234

この例では、EmployeePerson 型は Person および Employee インターフェースを結合し、name および employeeId プロパティの両方を持つ型になります。

関数内での交差型の使用

交差型は、複数の型プロパティを必要とする関数で使用することもできます。

function printEmployeeDetails(employee: Person & Employee): void {
  console.log(`Name: ${employee.name}`);
  console.log(`Employee ID: ${employee.employeeId}`);
}

const jane: EmployeePerson = {
  name: "Jane Smith",
  employeeId: 5678
};

printEmployeeDetails(jane);
// Output:
// Name: Jane Smith
// Employee ID: 5678

printEmployeeDetails 関数には、Person 型と Employee 型の両方を満たす引数が必要です。

和集合と積集合の結合

結合型と交差型を組み合わせて、複雑な型定義を作成できます。

type Shape = Circle | Rectangle;

interface Circle {
  kind: "circle";
  radius: number;
}

interface Rectangle {
  kind: "rectangle";
  width: number;
  height: number;
}

function getArea(shape: Shape): number {
  if (shape.kind === "circle") {
    return Math.PI * shape.radius * shape.radius;
  } else {
    return shape.width * shape.height;
  }
}

const myCircle: Circle = { kind: "circle", radius: 10 };
const myRectangle: Rectangle = { kind: "rectangle", width: 20, height: 30 };

console.log(getArea(myCircle)); // Output: 314.159...
console.log(getArea(myRectangle)); // Output: 600

この例では、Shape タイプは CircleRectangle の結合であり、getArea 関数は両方のタイプを適切に処理します。

結論

TypeScript のユニオン型と交差型は、型を管理および組み合わせる強力な方法を提供し、型定義の柔軟性と精度を高めます。ユニオン型では変数を複数の型のいずれかにすることができ、交差型では複数の型を 1 つに組み合わせることができます。これらの機能を使用することで、より堅牢で型安全なアプリケーションを作成できます。

ユニオン型と交差型の使用を練習して、それらの機能に慣れ、TypeScript コーディング スキルを向上させます。