TypeScriptの構造的部分型関係

TypeScriptにおける構造的部分型関係とは

TypeScriptにおける構造的部分型関係(structural subtyping)は、オブジェクトの型がその構造によって決まるという概念です。
TypeScriptでは、ある型が別の型の部分型(サブタイプ)であるかどうかは、その型が必要とするプロパティをすべて持っているかどうかによって判断されます。
これにより、柔軟で再利用性の高いコードを書くことができます。

具体的な例を挙げて説明します。

interface Person {
  name: string;
  age: number;
}

interface Employee {
  name: string;
  age: number;
  employeeId: number;
}

let person: Person = { name: "Alice", age: 25 };
let employee: Employee = { name: "Bob", age: 30, employeeId: 1234 };

person = employee;  // OK: EmployeeはPersonのすべてのプロパティを持っているため
// employee = person;  // エラー: PersonはemployeeIdプロパティを持っていないため

この例では、Employee型のオブジェクトはPerson型のオブジェクトに代入可能です。
これは、Employee型がPerson型のすべてのプロパティを持っているためです。
しかし、逆は成り立ちません。
Person型のオブジェクトはemployeeIdプロパティを持っていないため、Employee型の変数に代入することはできません。

このように、構造的部分型関係はオブジェクトのプロパティの存在によって決定され、明示的な継承関係は必要ありません。
これにより、TypeScriptは柔軟な型システムを提供し、さまざまな場面での型の再利用を容易にします。