目次
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 オプション