ブルーベリー本
『プロを目指す人のためのTypeScript入門』
https://gyazo.com/6f0f56e42059b2fc5d725d4487f71d80
著者
@uhyo
/mrsekut-book-4297127474
https://gihyo.jp/book/2022/978-4-297-12747-3
2022/4/22出版
https://blog.uhy.ooo/entry/2022-04-11/typescript-book/
対象はTypeScript v4.6
https://zenn.dev/uhyo/articles/blueberry-book-catchup
キャッチアップ記事
手に取った動機
TypeScript入門者に「何か良い本ある?」と聞かれた時に答えるため
おすすめするからには自分も読んでおかないといけない
どういうレベルの人が何章を読めば良いのか、に答えられるようにしておきたいmrsekut.icon
2章~5章は、プログラミング言語としては比較的普通の機能について
6章以降が、TypeScript独特の機能について
意外とConditional Typesとかmppaed typesについてあまり触れられてなかったりするの?
まだ読んでないので知らんmrsekut.icon
第1章 イントロダクション
/mrsekut-book-4297127474/016 (第1章 イントロダクション)
TypeScriptの概要
型安全性とドキュメント化
TypeScriptの歴史
ECMAScriptの概要
確かにECMASCriptとJavaScriptの関係を知らない人からしたらイミフなので、ここで解説されているのは親切
環境構築
第2章 基本的な文法・基本的な型
/mrsekut-book-4297127474/040 (第2章 基本的な文法・基本的な型)
かなり基本的な箇所から解説がある
変数宣言
プリミティブとオブジェクト
演算子
TypeScriptのBigInt型
ビット演算
/mrsekut-book-4297127474/077 (2.5 基本的な制御構文)
2.5 基本的な制御構文
2.5.1 条件分岐(1)if文の基本
2.5.2 ブロック
2.5.3 条件分岐(2)elseを使う
2.5.4 switch文
2.5.5 while文によるループ
2.5.6 for文によるループ
2.6 力試し
2.6.1 FizzBuzzを書いてみよう
2.6.2 解説
第3章 オブジェクトの基本とオブジェクトの型
/mrsekut-book-4297127474/088 (第3章 オブジェクトの基本とオブジェクトの型)
3.1 オブジェクトとは
3.1.1 オブジェクトは“連想配列”である
3.1.2 オブジェクトリテラル(1)基本的な構文
3.1.3 オブジェクトリテラル(2)プロパティ名の種々の指定方法
3.1.4 プロパティアクセス:値の取得と代入
3.1.5 オブジェクトリテラル(3)スプレッド構文
3.1.6 オブジェクトはいつ“同じ”なのか
3.2 オブジェクトの型
3.2.1 オブジェクト型の記法
3.2.2 オブジェクト型の型チェックと安全性
3.2.3 type文で型に別名をつける
3.2.4 interface宣言でオブジェクト型を宣言する
3.2.5 任意のプロパティ名を許容する型(インデックスシグネチャ)
3.2.6 オプショナルなプロパティの宣言
3.2.7 読み取り専用プロパティの宣言
3.2.8 typeofキーワードで変数の型を得る
3.3 部分型関係
3.3.1 部分型とは
3.3.2 プロパティの包含関係による部分型関係の発生
3.3.3 余剰プロパティに対する型エラーについて
3.4 型引数を持つ型
3.4.1 型引数を持つ型を宣言する
3.4.2 型引数を持つ型を使用する
3.4.3 部分型関係による型引数の制約
3.4.4 オプショナルな型引数
3.5 配列
3.5.1 配列リテラルで配列を作成する
3.5.2 配列の要素にアクセスする
3.5.3 配列型の記法
3.5.4 readonly配列型
3.5.5 配列の機能を使う
3.5.6 for-of文によるループ
3.5.7 タプル型
3.6 分割代入
3.6.1 オブジェクトの分割代入(1)基本的なパターン
3.6.2 オブジェクトの分割代入(2)ネストしたパターン
3.6.3 配列の分割代入
3.6.4 分割代入のデフォルト値
3.6.5 restパターンでオブジェクトの残りを取得する
3.7 その他の組み込みオブジェクト
3.7.1 Dateオブジェクト
3.7.2 正規表現オブジェクト(1)正規表現の基本
3.7.3 正規表現オブジェクト(2)正規表現を使う方法
3.7.4 Mapオブジェクト・Setオブジェクト
3.7.5 プリミティブなのにプロパティがある?
3.8 力試し
3.8.1 データ処理をしよう
3.8.2 解説
3.8.3 別解
第4章 TypeScriptの関数
/mrsekut-book-4297127474/150 (第4章 TypeScriptの関数)
完全に慣れたから何も思わないけど、初心者からすると嬉しさの差異が小さいのにやたらと関数定義の種類あるの意味不明よなmrsekut.icon
/mrsekut-book-4297127474/157
逆に function 関数式にできてアロー関数式にできないこととして「コンストラクタを作る」 ことが挙げられますが、 この機能はクラス (5.1) がある現在ではあまり使われません。
自分の場合はあえてfunctionを使うのはhositingの差異によるものぐらいかなあmrsekut.icon
関数の型を書くときに引数名を付けないといけない理由
エディタの支援機能を充実させるため、と説明されているが、後付けな気もする
でもuhyo氏ならこの辺の設計意図を調べた上で書いてそうな気もする
/mrsekut-book-4297127474/168
contexual typing
/mrsekut-book-4297127474/172
以下のように書いたときに、引数の型を明示しなくても良いやつ
code:ts
type F = (arg: number) => string
const xRepeat: F = (num) = "x".repeat(num)
Fの定義の時点で書いてるじゃん、という気もするがそういうことではなく、
実際はxRepeat: Fという変数にarrow functionを代入しているのでそういう解釈になる
「逆方向の推論」というのがパッとわからなかったが
/mrsekut-book-4297127474/174
4.2.5 コールシグネチャによる関数型の表現
4.3 関数型の部分型関係
4.3.1 返り値の型による部分型関係
4.3.2 引数の型による部分型関係
4.3.3 引数の数による部分型関係
4.4 ジェネリクス
4.4.1 関数の型引数とは
4.4.2 関数の型引数を宣言する方法
4.4.3 関数の型引数は省略できる
4.4.4 型引数を持つ関数型
4.5 変数スコープと関数
4.5.1 変数のスコープとは
4.5.2 ブロックスコープと関数スコープ
4.6 力試し
4.6.1 簡単な関数を書いてみよう
4.6.2 解説
4.6.3 コールバック関数の練習
4.6.4 解説
第5章 TypeScriptのクラス
/mrsekut-book-4297127474/200 (第5章 TypeScriptのクラス)
5.1 クラスの宣言と使用
5.1.1 クラス宣言とnew構文
5.1.2 プロパティを宣言する
5.1.3 メソッドを宣言する
5.1.4 コンストラクタ
5.1.5 静的プロパティ・静的メソッド
5.1.6 種類のアクセシビリティ修飾子
5.1.7 コンストラクタ引数でのプロパティ宣言
5.1.8 クラス式でクラスを作成する
5.1.9 もう1つのプライベートプロパティ
5.1.10 クラスの静的初期化ブロック
5.1.11 型引数を持つクラス
5.2 クラスの型
5.2.1 クラス宣言はインスタンスの型を作る
5.2.2 newシグネチャによるインスタンス化可能性の表現
5.2.3 instanceof演算子と型の絞り込み
5.3 クラスの継承
5.3.1 継承(1)子は親の機能を受け継ぐ
5.3.2 継承(2)親の機能を上書きする
5.3.3 override修飾子とその威力
5.3.4 privateとprotectedの動作と使いどころ
5.3.5 implementsキーワードによるクラスの型チェック
5.4 this
5.4.1 関数の中のthisは呼び出し方によって決まる
5.4.2 アロー関数におけるthis
5.4.3 thisを操作するメソッド
5.4.4 関数の中以外のthis
5.5 例外処理
5.5.1 throw文とErrorオブジェクト
5.5.2 例外をキャッチするtry-catch文
5.5.3 例外処理と大域脱出
5.5.4 finallyで脱出に割り込む
5.6 力試し
5.6.1 クラスに書き換えてみる
5.6.2 解説
5.6.3 クラスを関数に書き換えてみる
5.6.4 解説
第6章 高度な型
/mrsekut-book-4297127474/262 (第6章 高度な型)
6.1 ユニオン型とインターセクション型
6.1.1 ユニオン型の基本
6.1.2 伝播するユニオン型
6.1.3 インターセクション型とは
6.1.4 ユニオン型とインターセクション型の表裏一体な関係
6.1.5 オプショナルプロパティ再訪
6.1.6 オプショナルチェイニングによるプロパティアクセス
6.2 リテラル型
6.2.1 種類のリテラル型
6.2.2 テンプレートリテラル型
6.2.3 ユニオン型とリテラル型を組み合わせて使うケース
6.2.4 リテラル型のwidening
6.2.5 wideningされるリテラル型・wideningされないリテラル型
6.3 型の絞り込み
6.3.1 等価演算子を用いる絞り込み
6.3.2 typeof演算子を用いる絞り込み
6.3.3 代数的データ型をユニオン型で再現するテクニック
6.3.4 switch文でも型を絞り込める
6.4 keyof型・lookup型
6.4.1 lookup型とは
6.4.2 keyof型とは
6.4.3 keyof型・lookup型とジェネリクス
6.4.4 number型もキーになれる?
6.5 asによる型アサーション
6.5.1 型アサーションを用いて式の型をごまかす
6.5.2 as constの用法
6.6 any型とunknown型
6.6.1 any型という最終兵器
6.6.2 any型の存在理由
6.6.3 anyに近いが安全なunknown型
6.7 さらに高度な型
6.7.1 object型・never型
6.7.2 型述語(ユーザー定義型ガード)
6.7.3 可変長タプル型
6.7.4 mapped types
6.7.5 conditional types
6.7.6 組み込みの型を使いこなす
6.8 力試し
6.8.1 タグ付きユニオンの練習(1)
6.8.2 解説
6.8.3 タグ付きユニオンの練習(2)
6.8.4 解説
6.8.5 タグ付きユニオンの練習(3)
6.8.6 解説
第7章 TypeScriptのモジュールシステム
/mrsekut-book-4297127474/330 (第7章 TypeScriptのモジュールシステム)
7.1 import宣言とexport宣言
7.1.1 変数のエクスポートとインポート
7.1.2 関数もエクスポートできる
7.1.3 defaultエクスポートとdefaultインポート
7.1.4 型のインポート・エクスポート
7.1.5 その他の関連構文
7.2 Node.jsのモジュールシステム
7.2.1 Node.jsの組み込みモジュール
7.2.2 npmとは
7.2.3 package.jsonとpackage-lock.jsonの役割
7.3 DefinitelyTypedと@types
7.3.1 @typesパッケージのインストール
7.4 力試し
7.4.1 ファイルを読み込んでみる
7.4.2 解説
7.4.3 pathモジュールも使ってみる
7.4.4 解説
第8章 非同期処理
/mrsekut-book-4297127474/360 (第8章 非同期処理)
8.1 非同期処理とは
8.1.1 “時間がかかる処理”としての非同期処理
8.1.2 シングルスレッドモデル・ノンブロッキング
8.2 コールバックによる非同期処理の扱い
8.2.1 コールバック関数とは
8.2.2 タイマーの例
8.2.3 fsモジュールによるファイル操作の例
8.2.4 同期処理と非同期処理の順序
8.3 Promiseを使う
8.3.1 Promise版のfsを使ってみる
8.3.2 コールバック関数の登録とエラー処理(1)
8.3.3 コールバック関数の登録とエラー処理(2)
8.3.4 自分でPromiseオブジェクトを作る
8.3.5 Promiseの静的メソッド(1)
8.3.6 Promiseの静的メソッド(2)
8.3.7 Promiseの静的メソッド(3)
8.3.8 Promiseチェーン(1)チェーンを作る
8.3.9 Promiseチェーン(2)非同期処理の連鎖
8.3.10 Promiseチェーン(3)エラーの扱い
8.3.11 dynamic import構文
8.4 async/await構文
8.4.1 async関数を作ってみる
8.4.2 await式も使ってみる
8.4.3 awaitの返り値
8.4.4 awaitとエラー処理
8.4.5 async関数のいろいろな宣言方法
8.5 力試し
8.5.1 fs/promisesを使ってみる
8.5.2 解説
8.5.3 タイムアウトを追加してみよう
8.5.4 解説
第9章 TypeScriptのコンパイラオプション
/mrsekut-book-4297127474/404 (第9章 TypeScriptのコンパイラオプション)
9.1 tsconfig.jsonによるコンパイラオプションの設定
9.1.1 tsconfig.jsonの自動生成
9.1.2 ファイルパス周りの設定を押さえる
9.2 チェックの厳しさに関わるオプション
9.2.1 チェックをまとめて有効にできるstrictオプション
9.2.2 strictNullChecksでnullとundefinedを安全に検査する
9.2.3 型の書き忘れや推論の失敗を防ぐnoImplicitAnyオプション
9.2.4 インデックスアクセスを厳しくするnoUncheckedIndexedAccessオプション
9.2.5 新規プロジェクトでのお勧め設定
#スクボ読書化した本