Effective TypeScript 第2版
https://gyazo.com/f8342956ff62ceabb1dd3399cf27d76a
Effective TypeScript 第2版 - O'Reilly Japan
1章 TypeScriptとは何か
項目1 TypeScriptとJavaScriptの関係を理解する
JavaScriptはTypeScriptの集合に属する
しかし必ずしもTypeScriptはJavaScriptの構文ではかけない
項目2 どのTypeScriptオプションが使われているか把握する
noImplicitAny
変数がの型が不明な場合にTSがどう振る舞うか制御する
strictNullChecks
nullやundefinedがすべての型の値として許容されるべきかどうか
オフだとエラーにならん
項目3 コード生成は型に依存しないことを理解する
コンパイルできないというのは誤り
型チェックに失敗するというのが正しい
理由としては、TSが有効なJSである限り必ずコンパイルはされる
しかし型エラーにはなる
TSの型はコード生成に依存しない
コードの実行時に動作に影響しない
型は実行時に利用できない
型はコンパイル過程で削除されるのでパフォーマンスに影響はでない
項目4 構造的型付けに慣れる
型の「構造」に基づいて型が一致するか判断することが重要
閉じた型があることを理解する
シール型
宣言したプロパティを持ち、それ以外のプロパティは持たない型のこと
こういう型はTSでは作れない
項目5 any型の使用を制限する
anyは使うな!恩恵が受けられん!
2章 TypeScriptの型システム
項目6 エディターを使って型システムを調査、探求する
様々な型があるよ
VSCodeで変数を一気にリファクタリングすることができる
TSの型は、リファクタリングするのに便利
項目7 型を値の集合として考える
型は集合として考えることができるよ
never型は空集合
項目8 型空間のシンボルと値空間のシンボルの見分け方を知る
型空間
値空間
constとかletは値空間
項目9 型アノテーションを型アサーションより優先的に使用する
はい。その通りっすねrkasu.icon
型アサーションの場合は余剰プロパティチェックができない
余分なプロパティが入っているときにチェックする方法
インターセクションの場合でneverになってしまうときのunkown型の型アサーションはOK
DOMの型はTypeScriptは知ることできないのでアサーションOK
キャストするみたいな言い方はミスリーディング。
Cとかのキャストは値を変更できる
アサートする、アサーションするが正しい
項目10 ラッパーオブジェクト型(String、Number、Boolean、Symbol、BigInt)を使用しない
まあそうよね。その通り
typescript-eslintのno-wrapper-object-typesルールで使用禁止にできる
項目11 余剰プロパティチェックと型チェックを区別する
ここもその通りな内容であった
項目12 可能なら関数式全体に型を適用する
typeofの威力
他の関数のシグネチャに合わせるときに typeof fnを使い戻り値の型を変更するときはParametersとレストパラメータを使用する
項目13 type(型エイリアス)とinterfaceの違いを知る
どっち使ってもいい!
interfaceには型をマージする機能がある
オーグメンテーション
項目14 readonlyを使用して変更にまつわるエラーを避ける
readonlyは浅い効果しかない
Readonlyはプロパティにのみ作用する。メソッドには影響しないこと理解する
constは再代入を防ぐ。readonlyは変更を防ぐ
項目15 型演算とジェネリック型を使って重複を避ける
Pick、ReturnType、Partialを使いこなす
型を重複させないようにマッピングすることについて理解する
項目16 インデックスシグネチャよりも適切な代替手段を使う
Map型がある
これを使うとインデックスシグネチャーでふんわり定義してしまうより型検査にも引っかかりいい感じ
項目17 数値型のインデックスシグネチャを避ける
JSでは配列はオブジェクトのためキーは数値ではなく文字列である
TSではnumberになる
バグをはっけんしやすくするためにデザインされている
code:ts
interface ArrayLike<T> {
readonly length: number;
readonly n: number: T;
}
3章 型推論と制御フロー解析
項目18 推論可能な型でコードを乱雑にしない
関数内で正しく型付けすれば使う側でエラーにならないこともある
複数returnを持っていたり、パブリックAPIの一部だったり、名前付きの型を変えさせたい場合は戻り値に型アノテーションをつける
項目19 異なる型には異なる変数を使う
そのまま
定数ちゃんと使おうね
項目20 変数の型がどのように決まるか理解する
TypeScriptは具体性と柔軟性のバランスを取ろうとする
const 型アノテーション、ヘルパー関数、as,satisfiesなどを扱えるようにする必要がある
項目21 オブジェクトを一度に構築する
項目22 型の絞り込みを理解する
項目23 エイリアスを作成したら一貫してそれを使う
項目24 型推論に文脈がどう使われるか理解する
項目25 進化する型を理解する
項目26 関数型の標準APIやライブラリを使って型の流れを促進する
項目27 コールバックの代わりにasync関数を使用して型の流れを改善する
項目28 クラスやカリー化を使って型パラメーターを段階的に割り当てる
4章 型設計
項目29 有効な状態のみ表現する型を作る
項目30 入力には寛容に、出力には厳格に
項目31 型情報をドキュメントで繰り返さない
項目32 nullやundefinedを型エイリアスに含めない
項目33 null値を型の外側に押しやる
項目34 ユニオンを含むインターフェイスよりも、インターフェイスのユニオンを選択する
項目35 stringよりもそれに代わる、より精度の高い型を選択する
項目36 特別な値には専用の型を使用する
項目37 オプションプロパティは限定的に使用する
項目38 同じ型のパラメーターの繰り返しを避ける
項目39 差異のモデリングより型の統一を優先する
項目40 正確でない型より精度の低い型を選択する
項目41 ドメインの言語を使って型を命名する
項目42 たまたま目にしたデータに基づく型を避ける
5章 不健全性とany型
項目43 可能なかぎり狭いスコープでany型を使う
項目44 anyをそのまま使うのではなく、より具体的な形式で使う
項目45 安全でない型アサーションを、適切に型付けされた関数の内部に隠す
項目46 型が不明な値には、anyではなくunknownを使う
項目47 モンキーパッチではなく、より型安全なアプローチを採用する
項目48 健全性の罠を回避する
項目49 型カバレッジを監視し、型安全性のリグレッションを防ぐ
6章 ジェネリックと型レベルプログラミング
項目50 ジェネリックを型に対する関数と考える
項目51 不必要な型パラメーターを避ける
項目52 オーバーロードシグネチャより条件型を優先的に使用する
項目53 条件型のユニオンでの分配を制御する
項目54 テンプレートリテラル型を使ってDSLや文字列間の関係をモデリングする
項目55 型のテストを書く
項目56 型の表示に配慮する
項目57 再帰的なジェネリック型は末尾再帰にする
項目58 コード生成を複雑な型の代替手段として検討する
7章 TypeScriptレシピ集
項目59 never型を使って網羅性チェックを行う
項目60 オブジェクトに対して反復処理する方法を知る
項目61 Record型を使って値の同期を保つ
項目62 レストパラメーターとタプル型を使って、可変長引数の関数をモデリングする
項目63 never型のオプションプロパティを使って、排他的論理和をモデリングする
項目64 名前的型付けのためにブランドを使うことを検討する
8章 型宣言と@types
項目65 TypeScriptと@typesはdevDependenciesに追加する
項目66 型宣言の依存関係に関わる3つのバージョンを理解する
項目67 パブリックなAPIで使われるすべての型をエクスポートする
項目68 APIのコメントにTSDocを使う
項目69 コールバックのthisがAPIの一部なら、それに型を与える
項目70 型を部分的にコピーして依存を断ち切る
項目71 モジュールオーグメンテーションを使って型を改善する
9章 コードを書いて実行する
項目72 TypeScriptの独自機能の使用を避け、ECMAScriptの機能を使う
項目73 ソースマップを使ってTypeScriptをデバッグする
項目74 実行時に型を再構築する方法を知る
項目75 DOMの型階層を理解する
項目76 ターゲットとする環境の正確なモデルを作る
項目77 型チェックとユニットテストの関係を理解する
項目78 コンパイラーのパフォーマンスに注意を払う
10章 コードのモダン化とTypeScriptへの移行
項目79 モダンなJavaScriptを書く
項目80 @ts-checkとJSDocを使ってTypeScriptを試す
項目81 allowJsを使ってTypeScriptとJavaScriptを共存させる
項目82 依存関係グラフの下から上へモジュールごとに移行する
項目83 noImplicitAnyを有効にするまで、移行が完了したと考えない