3.3 部分型関係
TypeScriptには、ある型が別の型として扱えるかどうかを決定する 部分型関係(subtyping relation) という概念があります。
3.3.1 部分型とは
Section titled “3.3.1 部分型とは”部分型とは、2つの型の互換性を表す概念です。型 S が型 T の部分型である場合、T 型が期待される場所に S 型の値を渡すことができます。
- 共用性: 「
SはTの一種である」と言い換えることができます。 - 構造的部分型 (Structural Subtyping): TypeScriptは、名前ではなく「どのようなプロパティを持っているか」という構造で型を比較します。
3.3.2 プロパティの包含関係による部分型関係の発生
Section titled “3.3.2 プロパティの包含関係による部分型関係の発生”オブジェクト型における部分型関係は、主にプロパティの包含関係によって決まります。
- 条件: 型
Sが型Tの部分型となるためには、以下の条件を満たす必要があります。Tが持つすべてのプロパティがSにも存在する。- 共通するプロパティの型において、
S側の型がT側の型の部分型(または同じ型)である。
- 具体例: プロパティが多い型(より具体的な型)は、プロパティが少ない型(より抽象的な型)の部分型になります。
3.3.3 余剰プロパティに対する型エラーについて
Section titled “3.3.3 余剰プロパティに対する型エラーについて”基本的には「プロパティが多い分には問題ない」のが部分型関係の原則ですが、オブジェクトリテラルを直接代入する場合のみ、TypeScriptは厳格なチェックを行います。
- 余剰プロパティチェック: 型に定義されていないプロパティを持つオブジェクトリテラルを直接代入しようとすると、タイポなどのミスを防ぐためにコンパイルエラーとなります。
- 回避策: 一度変数に代入してから渡す(既に型が確定した状態にする)ことで、このチェックは行われなくなります。