Katsushi OUGI: Code & Life Notes – Life goes on

投稿日:

追加のプロパティを持つ値も型の集合に含まれる

引き続きこの書籍を読んでいる。

Effective TypeScriptの読書メモ。

英語の直訳からか難解な日本語が多いのでAIの解説が多いに役立つ。 「追加のプロパティを持つ値も型の集合に含まれる」という文章の解釈が難しかったのでAIに解説してもらったら納得。 以下にまとめておく。

ソースコードで書くと以下のような意味だそうだ。

type Person = {
  name: string;
  age: number;
};

const alice: Person = {
  name: 'Alice',
  age: 30,
  location: 'Tokyo', // これはエラーになる
};

// これはエラーにならない
const personWithExtra = {
  name: 'Bob',
  age: 24,
  location: 'Toyama',
};

const bob: Person = personWithExtra;

TypeScriptは「必要なプロパティがすべて存在していれば、それ以外の追加プロパティがあっても問題ない」と認識する。これがこの記事のタイトルの「追加のプロパティを持つ値も型の集合に含まれる」の意味である。

ただし、これには例外がある。

  1. オブジェクトリテラルを直接代入する場合は、余分なプロパティチェックが働いてエラーになる。
  2. 変数に一度代入してから他の変数に代入する場合は、チェックが緩和される。

これは「構造的型付け」と呼ばれるTypeScriptの特性に基づいている。
必要な構造(プロパティ)を持っていれば、それ以上のものを持っていても型として適合すると見なす。