このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

TypeScriptでのタイプタグによる分岐

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"; // 漏れがあるとコンパイラに叱られる
  }
}

ケース漏れはコンパイラが警告します。


この記事は「具体例(なんの?) // 人を表すデータ」の内容を別な題材で切り出したものです。もとの過去記事にも解説があります。

*1:インターセクション型を使ってミクシンのようなことは出来ます。

*2:型そのものとは別な場所に書くので、グループのメンバーに入れるのを忘れるリスクがあります。忘れないように。