← コース一覧
TypeScript
JavaScript に型を加えた言語 TypeScript を、公式ハンドブックの流れに沿って基礎から学びます。型注釈の書き方から始めて、ユニオン型と絞り込み、ジェネリクス、ユーティリティ型、クラスまで、実務で毎日使う機能を1レッスン1テーマで身につけます。
公式ドキュメント: TypeScript Handbook ↗基本の型
- 1実行可型注釈 — 変数に型を書く型注釈は、変数がどんな値を持つかをコードに明記する仕組みです。変数名の後ろにコロンと型名を書きます。たとえば let userName: string = "Taro" と書くと、userName には文字列しか入れられなくなります。
- 2実行可プリミティブ型 string / number / booleanTypeScript で最もよく使う基本の型が string(文字列)、number(数値)、boolean(真偽値)の3つです。number は整数と小数を区別せず、どちらも number 型として扱います。
- 3実行可型推論 — 注釈を省略できる場面変数を宣言と同時に初期化すると、TypeScript は代入された値から型を自動的に判断します。これを型推論と呼びます。let count = 0 と書けば、注釈がなくても count は number 型になります。
- 4実行可配列の型配列の型は、要素の型の後ろに [] を付けて書きます。number[] は数値の配列、string[] は文字列の配列です。Array<number> という書き方もありますが、意味は同じで [] の形が広く使われています。
- 5実行可タプル型タプル型は「長さが決まっていて、位置ごとに型が決まっている配列」です。[string, number] と書くと、0番目が文字列、1番目が数値の、要素2つの配列だけを受け付けます。
- 6実行可any — 型チェックをやめる型any は「この値の型チェックをやめる」という特別な型です。any 型の値には、どんな値を代入しても、どんなプロパティやメソッドを呼んでもコンパイルエラーになりません。
- 7実行可unknown — 型がまだ分からない値unknown は「型がまだ分からない」ことを表す型です。any と同じくどんな値でも入れられますが、決定的な違いとして、型を確かめるまで一切の操作ができません。
関数
- 8実行可関数の引数と戻り値の型関数では、各引数の後ろに型注釈を書き、引数リストの閉じカッコの後ろに戻り値の型を書きます。function add(a: number, b: number): number のような形です。
- 9実行可オプション引数とデフォルト値引数名の後ろに ? を付けると、その引数は省略できるオプション引数になります。また、引数に = で初期値を書くと、省略されたときにその値が使われるデフォルト値付き引数になります。
- 10実行可void — 値を返さない関数void は「この関数は値を返さない」ことを表す戻り値専用の型です。ログを出力するだけ、データを保存するだけ、といった return する値がない関数の戻り値に void を書きます。
- 11実行可関数型の書き方 — (x: number) => string「関数そのもの」にも型があります。(value: number) => string と書くと「number を1つ受け取り string を返す関数」という型になり、矢印の左に引数、右に戻り値の型を並べます。
オブジェクトの型
- 12実行可オブジェクトの型オブジェクトの型は、プロパティ名と型の組を波カッコで並べて書きます。{ name: string; age: number } のような形で、それぞれのプロパティがどんな型かを指定します。
- 13実行可オプショナルプロパティ ?プロパティ名の後ろに ? を付けると「あってもなくてもよい」省略可能なプロパティになります。{ name: string; nickname?: string } なら、nickname のないオブジェクトも代入できます。
- 14実行可readonly プロパティプロパティ名の前に readonly を付けると、そのプロパティは初期化の後に書き換えられなくなります。{ readonly id: number } のように書き、再代入しようとするとコンパイルエラーになります。
- 15実行可interface — オブジェクトの型に名前を付けるinterface は、オブジェクトの型に名前を付ける宣言です。interface User { name: string; age: number } と一度定義すれば、以降は User という名前だけでその形を指せます。
- 16実行可type エイリアスtype は、型に別名を付ける宣言です。type Point = { x: number; y: number } のようにオブジェクトの型にも使えますし、type Score = number のようにどんな型にも名前を付けられます。
- 17実行可interface の継承 extendsinterface は extends を使って別の interface を継承できます。interface Dog extends Animal と書くと、Dog は Animal のプロパティをすべて引き継いだうえで、自分のプロパティを追加できます。
- 18実行可インデックスシグネチャインデックスシグネチャは「キーの名前は決まっていないが、キーと値の型は決まっている」オブジェクトを表す書き方です。{ [key: string]: number } と書くと、どんな名前の文字列キーでも値は number、という意味になります。
ユニオン型と絞り込み
- 19実行可ユニオン型ユニオン型は「複数の型のうちどれか」を表す型で、型と型を | でつないで書きます。string | number は「文字列または数値」という意味になります。
- 20実行可リテラル型リテラル型は、特定の値そのものを型にしたものです。"open" という型には文字列 "open" しか入れられません。リテラル型をユニオンで並べた type Direction = "up" | "down" のような形で使うのが定番です。
- 21実行可typeof による絞り込みユニオン型の値は、if 文で typeof を確かめると、そのブロックの中では型が自動的に絞り込まれます。これを絞り込み(narrowing)と呼びます。typeof value === "string" の中では value は string として扱われ、文字列のメソッドが使えるようになります。
- 22実行可in と等価チェックによる絞り込みtypeof で区別できるのはプリミティブ型だけです。オブジェクト同士のユニオンは、"radius" in shape のように in 演算子で「そのプロパティを持っているか」を確かめて絞り込みます。
- 23実行可判別可能ユニオン判別可能ユニオンは、各メンバーに kind のような共通のリテラル型プロパティ(判別子)を持たせたユニオン型です。state.kind === "success" のように判別子を比較するだけで、そのメンバーの型に正確に絞り込まれます。
ジェネリクス
- 24実行可ジェネリック関数ジェネリクスは「型を後から決められる」仕組みです。関数名の後ろに <T> と型引数を書き、引数や戻り値の型に T を使います。呼び出すときの値に応じて、T が number や string に決まります。
- 25実行可ジェネリック制約 extends型引数に extends を付けると「T は最低限この形を持つ型」という条件を課せます。<T extends { length: number }> と書けば、T は length プロパティを持つ型に限定されます。
- 26実行可ジェネリックな型定義関数だけでなく、type や interface にも型引数を持たせられます。type Box<T> = { value: T } と定義すれば、Box<number> や Box<string> のように、中身の型だけ違う型を1つの定義から作れます。
型の操作
- 27実行可keyof — キーの一覧を型にするkeyof は、オブジェクト型からプロパティ名の一覧をユニオン型として取り出す演算子です。keyof User は "name" | "age" | "email" のような、キー名のリテラル型のユニオンになります。
- 28実行可typeof — 値から型を作る型を書く場所で typeof を使うと、既存の変数から型を取り出せます。type Settings = typeof defaultSettings と書けば、defaultSettings と同じ形の型が手に入ります。
- 29実行可Partial と RequiredPartial<T> は、型 T のすべてのプロパティを省略可能(? 付き)に変換するユーティリティ型です。逆に Required<T> は、すべてのプロパティを必須に変換します。
- 30実行可Pick と OmitPick<T, K> は、型 T から指定したプロパティだけを選んで新しい型を作ります。Omit<T, K> はその逆で、指定したプロパティを取り除いた型を作ります。
- 31実行可Record — キーと値の型を決めるRecord<K, V> は「キーが K 型、値が V 型のオブジェクト」を表すユーティリティ型です。Record<string, number> はインデックスシグネチャの { [key: string]: number } と同じ意味を、より短く書けます。
クラス
- 32実行可クラスのプロパティとメソッドの型クラスでは、プロパティをクラスの先頭で「名前: 型」の形で宣言します。メソッドは通常の関数と同じく、引数と戻り値に型を書きます。コンストラクタの引数にも型注釈を付けます。
- 33実行可アクセス修飾子 public / private / protectedプロパティやメソッドの前に付けるアクセス修飾子で、どこから触れるかを制限できます。public は どこからでも(省略時の既定)、private はそのクラスの中だけ、protected は継承先のクラスまで、という3段階です。
- 34実行可implements — インターフェースを実装するclass Dog implements Greeter のように implements を使うと、「このクラスは interface が定めたプロパティとメソッドを必ず備える」と宣言できます。足りないメンバーがあるとクラスの定義時点でエラーになります。