構造的部分型 (structural subtyping)とは
プログラミング言語の派生型(継承関係にある型)の方式の1つ。
派生型の方式は公称型(Nominal Typing)と構造的部分型(structural subtyping)があり、 TypeScriptは構造的部分型(structural subtyping)を採用している。
構造的部分型は、型の構造を比較し置換可能かを判定する。
つまりどういうことか?
type Fruits = { name: string; }; type Apple = { name: string; }; const apple: Apple = { name: "ジョナゴールド", }; // Fruits型の変数にApple型の変数を代入する const fruits: Fruits = apple; // コンパイルエラーにならない
構造の比較について
コンパイルエラーになるパターン
以下のパターンはコンパイルエラーになる。
type Fruits = { name: string; }; type Apple = { name: string; color: string; }; const fruits: Fruits = { name: "ジョナゴールド", }; // Apple型の変数にFruits型の変数を代入する const apple: Apple = fruits // エラー「プロパティ 'color' は型 'Fruits' にありませんが、型 'Apple' では必須です。」
コンパイルエラーにならないパターン
以下のパターンはコンパイルエラーにならない。
- なぜエラーにならないのか?
type Fruits = { name: string; }; type Apple = { name: string; color: string; }; const apple: Apple = { name: "ジョナゴールド", color: "赤", }; // Fruits型の変数にApple型の変数を代入する const fruits: Fruits = apple; // コンパイルエラーにならない // 代入はエラーにならないがアクセスはエラーになる fruits.color // エラー「プロパティ 'color' は型 'Fruits' に存在しません。」