👕

(読書感想文) プロを目指す人のためのTypeScript入門

に公開

目次

タイトル
第1章 イントロダクション
第2章 基本的な文法・基本的な型
第3章 オブジェクトの基本とオブジェクトの型
第4章 TypeScriptの型
第5章 TypeScriptのクラス
第6章 高度な型
第7章 TypeScriptのモジュールシステム
第8章 非同期処理
第9章 TypeScriptのコンパイラオプション

サマリー

タイトル通り、プロを目指す人のためのTypeScript入門書。フロントエンドやサーバサイドといった具体的な技術領域や具体的なアプリケーションの開発方法には踏み込まず、あくまでTypeScriptという言語そのものを解説している。

感想

ある程度業務でTypeScriptを触った人が、一度知識を体系的に整理するのに役立つ本だと感じた。プロダクションコードでよく使われる記法がどういう仕組みで動いているのかを理解する良い機会になると思う。

個人的に印象が残ったのはタグ付きユニオンのデータ型であった。ちなみに紹介されている実装例は以下のようなもの。

// 動物を表す型
type Animal = {
  tag: "animal"
  species: string
}

// 人間を表す型
type Human = {
  tag: "human",
  name: string
}

// ユーザーを表す型で Animal と Human のユニオン
type User = Animal | Human

// ユーザ名を返す関数
function getUserName(user: User) {
  if (user.tag === "human") {
    // user の型は Human に絞られる
    return user.name
  } else {
    // user の型は Animal に絞られる
    return "No name"
  }
}

const tama: User = {
  tag: "animal",
  species: "felis silvestris catus"
}

const uhyo: User = {
  tag: "human",
  name: "uhyo"
}

console.log(getUserName(tama)) // No name
console.log(getUserName(uhyo)) // uhyo

注目して欲しいのは getUserName の引数 user の型が if 節の中では Human 型に絞られており、逆に else 節の中では Animal 型に絞られているところである。

このテクニックは業務で頻出のResult型でも使われている。Result型をTypeScriptで採用することへの賛否はあると思うが、ここではそこについて触れない。たとえばResult型を使った簡易的な関数を以下のように書いてみた。

// 成功を表す型
type Success<T> = {
  ok: true
  value: T
}

// 失敗を表す型
type Failure<E extends Error> = {
  ok: false
  error: E
}

// 結果を表す型で Success と Failure のユニオン
type Result<T, E> = Success<T> | Failure<E>

// 引数の数字が偶数なら失敗の結果を、奇数なら成功の結果を返す関数
function getData(num: number): Result<string, Error> {
  if (num % 2 === 0) {
    return {
      ok: false,
      error: new Error("even number"),
    }
  }

  return {
    ok: true,
    value: "foo",
  }
}

const data = getData(0)

if (!data.ok) {
  // data の型は Failure に絞られる
  console.error(data.error)
} else {
  // data の型は Success に絞られる
  console.error(data.value)
}

先ほどの例では型の絞り込みに tag というプロパティを使っていたが、今回は ok というbooleanの値を代わりに使っている。こうすることで ok の値が false であれば失敗、逆に true であれば成功とみなして、失敗時と成功時の処理をそれぞれハンドリングできる。

このように、よくある実装の動作原理を説明できるようになるのが本書を読むメリットだろう。初級レベルの人が中級レベルにステップアップするには良い書籍だと思うが、本書では紹介されていないTypeScriptの機能も多くあるため、上級者を目指すならより詳細な解説をしている書籍を探したほうがよいと思われる。

Discussion