見出し画像

TypeScript 入門の記録(39)プロを目指す人のためのTypeScript入門(24)部分型関係

今日は、部分型関係(subtyping relation)について学習します。

部分型関係

TypeScriptの型システムの根幹をなす要素のひとつ、部分型関係について学習します。しっかり理解していかねば。

部分型とは

部分型は、2つの型の互換性を表す概念というのはわかるのですが、クラスと派生クラスの関係との違いが気になります。この疑問は、テキストと併せて、「サバイバルTypeScript」の構造的部分型(Structural Subtyping)の項を読んで、すっきりしました。部分型関係は、構造的部分型と呼ばれ、「その型の見た目(シグネチャ)が等しければ置換可能である」というところが、JavaやC++のクラス定義で採用されている公称型(Nominal Typing)との違いなんですね。まったく無関係のオブジェクト型同士が部分型関係を持つことができるのは、とても柔軟だと思います。

プロパティの包含関係

オブジェクト型SとTがあり、以下の2つの条件が満たされる場合、型Sは型Tの部分型になります。

  1. 型Tが持つプロパティの全てが、Sにも存在する。

  2. 条件1の各プロパティについて、型Sのプロパティと型Tのプロパティの型の部分型(または同じ型)である。

これを試してみます。
テキストの例を少しアレンジして、Animal、Human、Pet、AnimalFamily、HumanFamilyを定義しました。

部分型関係の確認用にAnimal,Human,Pet,AnimalFamily,HumanFamilyを定義

この型定義を利用して、HumanFamilyのオブジェクトをAnimalFamilyのオブジェクトに代入して利用できることを確認します。

HumanFamilyオブジェクトをanimalsに代入してconsole出力した結果

更に、animalsに代入した結果を利用する際に、Animalに定義されていないnameプロパティにアクセスしようとするとエラーが発生することも確認しました。

animals.father.nameはAnimalに定義されていないプロパティなのでアクセスできない

余剰プロパティに対する型エラー

型注釈がある変数にオブジェクトリテラルを代入する場合に、部分型関係で問題ない値の代入であっても、型の定義にないプロパティのある値を代入すると余剰プロパティとしてエラー判定されます。

余剰プロパティエラー

このエラーは、一旦型注釈なしのオブジェクトとして定義したものを代入すればエラーを回避できます。

型注釈なしのオブジェクトとして定義してから代入すればエラー判定されない

部分型関係まとめ

部分型関係は、明示的な型派生の定義をしなくても、結果的にプロパティの比較をした結果、その型の見た目(シグネチャ)が等しければ部分型関係にあると判断されるというものでした。かなり柔軟だと感じましたが、どんな場面に適しているかは引き続き学習を深めていけたらと思います。

今日の学習はここまでにします。続きは、また次の週末の予定です。


この記事が気に入ったらサポートをしてみませんか?