Open2

typescript雑記

にっしーにっしー

extendsの使い道二つ

  1. インターフェースの拡張(Interface Extension):
interface Person {
    name: string;
    age: number;
}

interface Employee extends Person {
    employeeId: number;
}

const employee: Employee = {
    name: "John Doe",
    age: 30,
    employeeId: 1234
};

上記の例では、EmployeeインターフェースはPersonインターフェースを継承しており、nameとageのプロパティに加えてemployeeIdのプロパティも持つことができる。
本当に拡張そのものの意味って感じ!

  1. 型パラメータの制約(Generic Constraints):
function logProperty<T extends { length: number }>(arg: T): void {
    console.log(arg.length);
}

logProperty("Hello, world!"); // OK: string は length プロパティを持つ
logProperty([1, 2, 3]);       // OK: 配列も length プロパティを持つ
// logProperty(123);          // エラー: number は length プロパティを持たない

この例では、ジェネリック型Tはlengthプロパティを持つオブジェクトに制約されている。そのため、logProperty関数はlengthプロパティを持つ値(例えば文字列や配列)に対してのみ呼び出すことができる。
拡張って意味っぽくないけど、見方によっては、Tは{ length: number }という型を拡張しているとも捉えられると僕は認識しました

まとめ

インターフェースの拡張:インターフェースを他のインターフェースから継承し、プロパティやメソッドを追加することができる。
型パラメータの制約:ジェネリック型に対して特定のプロパティやメソッドを持つことを要求する制約を課すことができる。