Dev Study
← コース一覧

TypeScript

JavaScript に型を加えた言語 TypeScript を、公式ハンドブックの流れに沿って基礎から学びます。型注釈の書き方から始めて、ユニオン型と絞り込み、ジェネリクス、ユーティリティ型、クラスまで、実務で毎日使う機能を1レッスン1テーマで身につけます。

公式ドキュメント: TypeScript Handbook

基本の型

  1. 1
    型注釈 — 変数に型を書く
    型注釈は、変数がどんな値を持つかをコードに明記する仕組みです。変数名の後ろにコロンと型名を書きます。たとえば let userName: string = "Taro" と書くと、userName には文字列しか入れられなくなります。
    実行可
  2. 2
    プリミティブ型 string / number / boolean
    TypeScript で最もよく使う基本の型が string(文字列)、number(数値)、boolean(真偽値)の3つです。number は整数と小数を区別せず、どちらも number 型として扱います。
    実行可
  3. 3
    型推論 — 注釈を省略できる場面
    変数を宣言と同時に初期化すると、TypeScript は代入された値から型を自動的に判断します。これを型推論と呼びます。let count = 0 と書けば、注釈がなくても count は number 型になります。
    実行可
  4. 4
    配列の型
    配列の型は、要素の型の後ろに [] を付けて書きます。number[] は数値の配列、string[] は文字列の配列です。Array<number> という書き方もありますが、意味は同じで [] の形が広く使われています。
    実行可
  5. 5
    タプル型
    タプル型は「長さが決まっていて、位置ごとに型が決まっている配列」です。[string, number] と書くと、0番目が文字列、1番目が数値の、要素2つの配列だけを受け付けます。
    実行可
  6. 6
    any — 型チェックをやめる型
    any は「この値の型チェックをやめる」という特別な型です。any 型の値には、どんな値を代入しても、どんなプロパティやメソッドを呼んでもコンパイルエラーになりません。
    実行可
  7. 7
    unknown — 型がまだ分からない値
    unknown は「型がまだ分からない」ことを表す型です。any と同じくどんな値でも入れられますが、決定的な違いとして、型を確かめるまで一切の操作ができません。
    実行可

関数

  1. 8
    関数の引数と戻り値の型
    関数では、各引数の後ろに型注釈を書き、引数リストの閉じカッコの後ろに戻り値の型を書きます。function add(a: number, b: number): number のような形です。
    実行可
  2. 9
    オプション引数とデフォルト値
    引数名の後ろに ? を付けると、その引数は省略できるオプション引数になります。また、引数に = で初期値を書くと、省略されたときにその値が使われるデフォルト値付き引数になります。
    実行可
  3. 10
    void — 値を返さない関数
    void は「この関数は値を返さない」ことを表す戻り値専用の型です。ログを出力するだけ、データを保存するだけ、といった return する値がない関数の戻り値に void を書きます。
    実行可
  4. 11
    関数型の書き方 — (x: number) => string
    「関数そのもの」にも型があります。(value: number) => string と書くと「number を1つ受け取り string を返す関数」という型になり、矢印の左に引数、右に戻り値の型を並べます。
    実行可

オブジェクトの型

  1. 12
    オブジェクトの型
    オブジェクトの型は、プロパティ名と型の組を波カッコで並べて書きます。{ name: string; age: number } のような形で、それぞれのプロパティがどんな型かを指定します。
    実行可
  2. 13
    オプショナルプロパティ ?
    プロパティ名の後ろに ? を付けると「あってもなくてもよい」省略可能なプロパティになります。{ name: string; nickname?: string } なら、nickname のないオブジェクトも代入できます。
    実行可
  3. 14
    readonly プロパティ
    プロパティ名の前に readonly を付けると、そのプロパティは初期化の後に書き換えられなくなります。{ readonly id: number } のように書き、再代入しようとするとコンパイルエラーになります。
    実行可
  4. 15
    interface — オブジェクトの型に名前を付ける
    interface は、オブジェクトの型に名前を付ける宣言です。interface User { name: string; age: number } と一度定義すれば、以降は User という名前だけでその形を指せます。
    実行可
  5. 16
    type エイリアス
    type は、型に別名を付ける宣言です。type Point = { x: number; y: number } のようにオブジェクトの型にも使えますし、type Score = number のようにどんな型にも名前を付けられます。
    実行可
  6. 17
    interface の継承 extends
    interface は extends を使って別の interface を継承できます。interface Dog extends Animal と書くと、Dog は Animal のプロパティをすべて引き継いだうえで、自分のプロパティを追加できます。
    実行可
  7. 18
    インデックスシグネチャ
    インデックスシグネチャは「キーの名前は決まっていないが、キーと値の型は決まっている」オブジェクトを表す書き方です。{ [key: string]: number } と書くと、どんな名前の文字列キーでも値は number、という意味になります。
    実行可

ユニオン型と絞り込み

  1. 19
    ユニオン型
    ユニオン型は「複数の型のうちどれか」を表す型で、型と型を | でつないで書きます。string | number は「文字列または数値」という意味になります。
    実行可
  2. 20
    リテラル型
    リテラル型は、特定の値そのものを型にしたものです。"open" という型には文字列 "open" しか入れられません。リテラル型をユニオンで並べた type Direction = "up" | "down" のような形で使うのが定番です。
    実行可
  3. 21
    typeof による絞り込み
    ユニオン型の値は、if 文で typeof を確かめると、そのブロックの中では型が自動的に絞り込まれます。これを絞り込み(narrowing)と呼びます。typeof value === "string" の中では value は string として扱われ、文字列のメソッドが使えるようになります。
    実行可
  4. 22
    in と等価チェックによる絞り込み
    typeof で区別できるのはプリミティブ型だけです。オブジェクト同士のユニオンは、"radius" in shape のように in 演算子で「そのプロパティを持っているか」を確かめて絞り込みます。
    実行可
  5. 23
    判別可能ユニオン
    判別可能ユニオンは、各メンバーに kind のような共通のリテラル型プロパティ(判別子)を持たせたユニオン型です。state.kind === "success" のように判別子を比較するだけで、そのメンバーの型に正確に絞り込まれます。
    実行可

ジェネリクス

  1. 24
    ジェネリック関数
    ジェネリクスは「型を後から決められる」仕組みです。関数名の後ろに <T> と型引数を書き、引数や戻り値の型に T を使います。呼び出すときの値に応じて、T が number や string に決まります。
    実行可
  2. 25
    ジェネリック制約 extends
    型引数に extends を付けると「T は最低限この形を持つ型」という条件を課せます。<T extends { length: number }> と書けば、T は length プロパティを持つ型に限定されます。
    実行可
  3. 26
    ジェネリックな型定義
    関数だけでなく、type や interface にも型引数を持たせられます。type Box<T> = { value: T } と定義すれば、Box<number> や Box<string> のように、中身の型だけ違う型を1つの定義から作れます。
    実行可

型の操作

  1. 27
    keyof — キーの一覧を型にする
    keyof は、オブジェクト型からプロパティ名の一覧をユニオン型として取り出す演算子です。keyof User は "name" | "age" | "email" のような、キー名のリテラル型のユニオンになります。
    実行可
  2. 28
    typeof — 値から型を作る
    型を書く場所で typeof を使うと、既存の変数から型を取り出せます。type Settings = typeof defaultSettings と書けば、defaultSettings と同じ形の型が手に入ります。
    実行可
  3. 29
    Partial と Required
    Partial<T> は、型 T のすべてのプロパティを省略可能(? 付き)に変換するユーティリティ型です。逆に Required<T> は、すべてのプロパティを必須に変換します。
    実行可
  4. 30
    Pick と Omit
    Pick<T, K> は、型 T から指定したプロパティだけを選んで新しい型を作ります。Omit<T, K> はその逆で、指定したプロパティを取り除いた型を作ります。
    実行可
  5. 31
    Record — キーと値の型を決める
    Record<K, V> は「キーが K 型、値が V 型のオブジェクト」を表すユーティリティ型です。Record<string, number> はインデックスシグネチャの { [key: string]: number } と同じ意味を、より短く書けます。
    実行可

クラス

  1. 32
    クラスのプロパティとメソッドの型
    クラスでは、プロパティをクラスの先頭で「名前: 型」の形で宣言します。メソッドは通常の関数と同じく、引数と戻り値に型を書きます。コンストラクタの引数にも型注釈を付けます。
    実行可
  2. 33
    アクセス修飾子 public / private / protected
    プロパティやメソッドの前に付けるアクセス修飾子で、どこから触れるかを制限できます。public は どこからでも(省略時の既定)、private はそのクラスの中だけ、protected は継承先のクラスまで、という3段階です。
    実行可
  3. 34
    implements — インターフェースを実装する
    class Dog implements Greeter のように implements を使うと、「このクラスは interface が定めたプロパティとメソッドを必ず備える」と宣言できます。足りないメンバーがあるとクラスの定義時点でエラーになります。
    実行可