大規模開発でも小規模開発でも使える TypeScript実践入門

書籍の概要

この本の概要

最近,TypeScriptへの注目度は非常に高まっていますが,TypeScriptは単なるJavaScriptの置き換えではありません。TypeScriptを使えば,(1)早い=開発効率のアップが望める/(2)軽い=クライアント側の機能を拡大できる(いちいちサーバにアクセスしない)/(3)大規模=大規模開発に対応している,という恩恵が得られます。本書は,この3つのポイントにフォーカスして,しかもTypeScriptで「できること」の基本を漏れなく説明していくことを目指します。本書で身につけた知識は,大規模であろうと小規模であろうと今後の開発において必ずや役立つはずです。

こんな方におすすめ

  • TypeScriptに興味はあるが,知識経験は乏しい方
  • JavaScriptの基礎的な知識はあり,簡単なHTML5のサイトは作成できるレベルの方

目次

Preface 本書で扱うこと

Chapter 1 TypeScriptを使う

1.1 コンパイル

  • 1.1.1 本書で前提とする環境
  • 1.1.2 コンパイルとは何か?
  • 1.1.3 コンパイラは必要なのか?
  • 1.1.4 コンパイラは忘れることができるのか?
  • 1.1.5 JavaScriptプログラマーよ,注意せよ!

1.2 型の導入

  • 1.2.1 ネーミングの秘密
  • 1.2.2 2種類ある型
  • 1.2.3 基本的な型の数々
  • 1.2.4 型指定でバグを検出できる例
  • 1.2.5 型の推論
  • 1.2.6 演算子と型

1.3 アンビエント

  • 1.3.1 利用できない変数
  • 1.3.2 見つからない理由
  • 1.3.3 対処方法としてのアンビエント
  • 1.3.4 “はず”という見込みの問題

1.4 any型

  • 1.4.1 何でも入る魔法の箱
  • 1.4.2 最強無敵のany型
  • 1.4.3 穴だらけのany型
  • 1.4.4 anyを使え!―Part1
  • 1.4.5 anyを使え!―Part2
  • 1.4.6 anyを使うな!

1.5 JavaScriptとのソースコードの互換性

  • 1.5.1 互換性があるとき
  • 1.5.2 互換性がないとき
  • 1.5.3 互換性があることにより発生する問題

1.6 関数

  • 1.6.1 関数に型を付ける
  • 1.6.2 省略可能な引数
  • 1.6.3 可変長の引数
  • 1.6.4 関数のオーバーロード

1.7 クラス

  • 1.7.1 クラスとは何か?
  • 1.7.2 クラスの書き方
  • 1.7.3 アクセシビリティを指定する
  • 1.7.4 コンストラクター
  • 1.7.5 コンストラクターの引数
  • 1.7.6 コンストラクターの引数でメンバーを宣言する
  • 1.7.7 静的なメンバー
  • 1.7.8 クラスとJavaScriptの関係
  • 1.7.9 クラスの種類を判定する
  • 1.7.10 クラスはあったほうが良いのか?

1.8 継承

  • 1.8.1 クラスの機能を追加したい
  • 1.8.2 superの問題
  • 1.8.3 継承したクラスの型
  • 1.8.4 型の上書き
  • 1.8.5 クラスの機能の置き換え
  • 1.8.6 継承したクラスとinstanceof

1.9 インターフェース

  • 1.9.1 実装を持たないインターフェース
  • 1.9.2 インターフェースの実装
  • 1.9.3 オブジェクトをインターフェース経由で使う
  • 1.9.4 インターフェースの継承
  • 1.9.5 2つ以上のインターフェースの実装
  • 1.9.6 インターフェースの合成
  • 1.9.7 インターフェースとアクセシビリティ
  • 1.9.8 特殊化されたシグネチャ
  • 1.9.9 消えるインターフェース
  • 1.9.10 インターフェースいらず?

1.10 アロー関数

  • 1.10.1 アロー関数
  • 1.10.2 関数の型
  • 1.10.3 中括弧の省略
  • 1.10.4 小括弧の省略
  • 1.10.5 thisの挙動
  • 1.10.6 記号の注意

1.11 列挙型

  • 1.11.1 “赤”組はない!
  • 1.11.2 数値の問題
  • 1.11.3 文字列を得る
  • 1.11.4 数値の明示的な指定
  • 1.11.5 同じ数値は使えるか?
  • 1.11.6 列挙型の合成
  • 1.11.7 ビットマスクとしての利用

1.12 ジェネリック

  • 1.12.1 値の抽象化,型の抽象化
  • 1.12.2 クラスで型引数を使う
  • 1.12.3 any型とジェネリックの違いは何か?
  • 1.12.4 複数の型引数を使う
  • 1.12.5 静的メンバーは型引数を参照できない
  • 1.12.6 型の制約

1.13 型の変換

  • 1.13.1 toString()とはどう違うのか?
  • 1.13.2 継承と型アサーション
  • 1.13.3 インターフェースと型
  • 1.13.4 名前付きの型がなくてもよいとき
  • 1.13.5 コンパイラの限界

1.14 内部モジュール

  • 1.14.1 複雑さの爆発とは何か?
  • 1.14.2 モジュールとクラスの違い
  • 1.14.3 内部モジュールとは何か?
  • 1.14.4 モジュールの合成
  • 1.14.5 importでエイリアス

1.15 外部モジュール

  • 1.15.1 外部モジュールとは何か?
  • 1.15.2 外部モジュールを使用する2つの方法
  • 1.15.3 最小の外部モジュール利用コード
  • 1.15.4 外部モジュールの初期化コード
  • 1.15.5 外部モジュールは読み込まれるとは限らない
  • 1.15.6 輸出していないが必要とされるモジュール

1.16 参照の埋め込み

  • 1.16.1 参照の注意点
  • 1.16.2 Windows依存と非依存

Chapter 2 型の使い方と開発効率アップの考え方

2.1 モジュールの分割

  • 2.1.1 モジュール分割の重要性
  • 2.1.2 モジュール分割をするか? しないか?
  • 2.1.3 モジュール分割の基本
  • 2.1.4 モジュール分割と階層の深さの問題
  • 2.1.5 さまざまなモジュールのファイル分割方法

2.2 クラスの分割

  • 2.2.1 クラスとモジュールの曖昧性
  • 2.2.2 クラスとモジュールの使い分け
  • 2.2.3 クラス分けの錯誤
  • 2.2.4 過剰な汎用化
  • 2.2.5 継承とクラス分け
  • 2.2.6 兄弟の無効化
  • 2.2.7 動的な兄弟
  • 2.2.8 クラスの価値

2.3 関数の分割

  • 2.3.1 なぜ関数に分けるのか?
  • 2.3.2 同じコードを統合するための関数
  • 2.3.3 サイズの適正化のための分割
  • 2.3.4 名前を付けるための分割
  • 2.3.5 ローカル変数のための分割

2.4 可視範囲の制御

  • 2.4.1 それは隠したい
  • 2.4.2 関数による制御
  • 2.4.3 クラスによる制御
  • 2.4.4 モジュールによる制御
  • 2.4.5 複数モジュールによる制御
  • 2.4.6 可視範囲制御のネスト
  • 2.4.7 大規模開発の指針

2.5 関数に名前を付ける場合と付けない場合

  • 2.5.1 ローカル関数
  • 2.5.2 関数に名前は必要か?
  • 2.5.3 スコープを切る関数
  • 2.5.4 キャプチャを支援する関数
  • 2.5.5 アロー関数と匿名関数はどちらを使うべきか?

2.6 抽象度をアップしてのコード短縮

  • 2.6.1 抽象の光と闇
  • 2.6.2 具象とは何か? 抽象とは何か?
  • 2.6.3 なぜ抽象化するのか?
  • 2.6.4 抽象化の方法―汎用化編
  • 2.6.5 抽象化の方法―インターフェース編
  • 2.6.6 抽象化の方法―継承編
  • 2.6.7 抽象化の方法―関数参照編
  • 2.6.8 いきすぎた抽象化とは何か?

2.7 類似処理の統合

  • 2.7.1 シンプルな統合
  • 2.7.2 込み入った統合

2.8 共通ライブラリの作成

  • 2.8.1 共通ライブラリとは何か?
  • 2.8.2 湯豆腐方式 vs お雑煮方式
  • 2.8.3 外部モジュール方式 vs 一般ソースファイル方式
  • 2.8.4 export方式 vs export代入方式
  • 2.8.5 動的ローディング方式 vs 静的ローディング方式

2.9 コレクションの扱い

  • 2.9.1 それは必要なのか?
  • 2.9.2 スタックとして使う配列
  • 2.9.3 キューとして使う配列
  • 2.9.4 動的に拡大する配列
  • 2.9.5 連想配列のように扱えるオブジェクト

2.10 名前空間の利用

  • 2.10.1 名前空間とは何か?
  • 2.10.2 大規模開発では何を意識するのか?

Chapter 3 既存ライブラリの活用

3.1 型の定義ファイル

  • 3.1.1 拡張子を変えてしまえ
  • 3.1.2 拡張子を変えられないとき

3.2 どのようなライブラリの定義があるのか?

  • 3.2.1 すでにある型定義とは何か?
  • 3.2.2 なくても心配無用

3.3 TypeScriptからどう使うか?

  • 3.3.1 NuGetは万能か?
  • 3.3.2 バージョンの乖離問題
  • 3.3.3 あえてNuGetを使わない
  • 3.3.4 ルール作りの問題

3.4 型定義がないライブラリはどう使うか?

  • 3.4.1 型定義がないライブラリに対処する方法
  • 3.4.2 型定義ファイルの手動作成 vs 自動作成

3.5 any型が使用されても平気なのか?

  • 3.5.1 型定義ファイルがany型を指定する問題
  • 3.5.2 anyが使用された例

Chapter 4 サーバーとクライアントの分担

4.1 UIはどうするか?

  • 4.1.1 3つの選択肢
  • 4.1.2 本当にクライアントにすべて任せるべきか?
  • 4.1.3 ページ構成の見直し
  • 4.1.4 ページ分割の見直し
  • 4.1.5 クライアントとサーバーの作業分担の見直し
  • 4.1.6 2つのバージョンの作成

4.2 ストレージはどうするか?

  • 4.2.1 データの保存方法
  • 4.2.2 新しい選択肢
  • 4.2.3 ローカルストレージを活用せよ!
  • 4.2.4 実際にローカルストレージを使ってみよう

4.3 サーバーを必須とする機能の抽出

  • 4.3.1 サーバーとクライアントの機能分割の原則
  • 4.3.2 一般論としての結論

4.4 いかにしてクライアント処理の割合を増やすか?

  • 4.4.1 クライアント処理への障害
  • 4.4.2 スクリプトの停止の問題
  • 4.4.3 スクリプトのバージョンの問題
  • 4.4.4 スクリプトの非互換の問題
  • 4.4.5 処理速度の不足の問題
  • 4.4.6 容量の不足の問題
  • 4.4.7 通信のオーバーヘッドの問題
  • 4.4.8 スクリプトのハイジャックへの懸念

4.5 サーバーと通信できない場合の対処

  • 4.5.1 操作が複雑化したシステムの事情
  • 4.5.2 最悪のコード
  • 4.5.3 エラーの事実を示す
  • 4.5.4 わかりやすいエラーメッセージを示す
  • 4.5.5 詳細情報を付ける
  • 4.5.6 禁止状態は解除する
  • 4.5.7 エラーを軽視するなかれ

Chapter 5 複数ページの構成

5.1 複数ページへの分け方

  • 5.1.1 なぜ複数ページに分けるのか?
  • 5.1.2 分けないほうが良いページ
  • 5.1.3 スクリプトの分け方
  • 5.1.4 スクリプトの選択的用法
  • 5.1.5 複数ページ間で共通のスクリプトの設定
  • 5.1.6 ページ遷移して結果を出すか? しないで出すか?
  • 5.1.7 共通レイアウトページは是か非か?
  • 5.1.8 モジュール分けをするかは最初に決める

Chapter 6 ページ間の共通機能

6.1 ページ間の共通機能

  • 6.1.1 ページ間の共通機能はどう記述するか?
  • 6.1.2 共通機能のためのコードはどこに置くか?
  • 6.1.3 特に共通機能に要求されること

Chapter 7 ページ間での情報の継続

7.1 ページ間での情報の継続

  • 7.1.1 共通情報をどこに格納するか?
  • 7.1.2 難しさの理由
  • 7.1.3 結局どうするのか?

Chapter 8 サーバーとの通信

8.1 型のないデータ通信と型のあるTypeScriptの関係

  • 8.1.1 JSONの通信での型への対応
  • 8.1.2 2つの通信方法

8.2 通信形式として何を使うのか?

  • 8.2.1 どの形式が良いのか?

8.3 送信データのTypeScriptによる処理

  • 8.3.1 形式ごとの処理

8.4 受信データのTypeScriptによる処理

  • 8.4.1 形式ごとの処理

8.5 好ましい送信,好ましくない送信

  • 8.5.1 好ましい送信,好ましくない送信とは何か?

8.6 結果を返す型はどう扱うべきか?

  • 8.6.1 結果を返す型の混迷

8.7 共通化されたインターフェースと専用インターフェース

  • 8.7.1 2つのインターフェース
  • 8.7.2 共通化インターフェース型
  • 8.7.3 専用インターフェース型
  • 8.7.4 真の必要クラス数はさらに2倍ある
  • 8.7.5 本当にトラフィックは増えるのか?
  • 8.7.6 折衷型はどうか?

Chapter 9 クラウドとTypeScript

9.1 クラウドの問題

  • 9.1.1 クラウドを使うべきか?
  • 9.1.2 Visual StudioとAzure開発の場合
  • 9.1.3 スケールアウト vs TypeScriptでの効率アップ

Chapter 10 TypeScriptとコンパイル結果

10.1 コンパイル結果を直接使う

  • 10.1.1 TypeScript最大の敵
  • 10.1.2 TypeScriptのコンパイル結果とは何か?
  • 10.1.3 デバッグの問題
  • 10.1.4 実は主体性がないTypeScript
  • 10.1.5 TypeScript上級を目指せ

Chapter 11 サンプルソース

11.1 掲示板ソフト「ジバン(Jiban)」

  • 11.1.1 ジバン(Jiban)について
  • 11.1.2 基本的な考え方
  • 11.1.3 補足
  • 11.1.4 TsBase.ts
  • 11.1.5 jibanModule.ts
  • 11.1.6 JibanAPIController.cs(サーバー側のコード.参考用.一部のみ抜粋)

付録

Appendix 1 Visual Studio Expressによる無料環境構築

  • A1.1 Visual Studioを選択する理由
  • A1.2 環境を確認しよう
  • A1.3 Visual Studio本体を手に入れる
  • A1.4 旧版の罠を回避せよ
  • A1.5 Update 3を手に入れる
  • A1.6 最初の一歩を踏み出そう

Appendix 2 コマンドラインのコンパイラ

  • A2.1 基本的な書式
  • A2.2 例
  • A2.3 オプション