JSON形式で表現されるデータがあったとして、データの型付け〈typing〉をTypeScriptで記述するとしましょう。インターフェイスやクラスを使わずに、次のように型定義するとお手軽です。
type A = { "type" : "a", // A specific } type B = { "type" : "b", // B specific } type C = { "type" : "c", // C specific }
型定義の見た目もJSONっぽいです。
ここで、A, B, C は“お仲間”とみなしていい型達だとします。だとすると、「A, B, C はお仲間である」という情報が欠けています。インターフェイス/クラスなら、お仲間であることは共通の親からextends
して示せます。上の書き方だとextends
は書けません*1。
型のグループに名前を付けてあげればいいでしょう*2。
type X = A | B | C type XTypeTag = X["type"]
2行目の定義により、型 XTypeTag は次と同じになります。
type XTypeTag = "a" | "b" | "c"
型Xが親の型で、サブタイプ A, B, C はタイプタグで判別することになります。こうして定義されるサブタイプは、クラス/インターフェイスの型階層より“ゆるく”なります。しかしそれでも、「型がXのJSONオブジェクトのtypeプロパティ値が "a", "b", "c" 以外はダメだ」ということをコンパイラ〈トランスパイラ〉は知っています。
function explain(x: X) : string { let t: XTypeTag = x.type; switch (t) { case "a" : return "Good one"; case "b" : return "Nice stuff"; // case "c" : return "Excellent thing"; // 漏れがあるとコンパイラに叱られる } }
ケース漏れはコンパイラが警告します。
この記事は「具体例(なんの?) // 人を表すデータ」の内容を別な題材で切り出したものです。もとの過去記事にも解説があります。