プロを目指す人のためのTypeScript入門 を読んだ

TypeScript を雰囲気で使っている感覚があったのでもうちょい深く知るかと思って読んでみた。

プロを目指すとあったので実践入門的な書籍かと思ったけど、入門とあって結構基本的なことの解説も多くて、それなりに TypeScript を書いているので知ってる内容も多かった。でもいくつか知らないことを知れたり、TypeScript の奥深さや高度な型など理解できたのはよかった。また、TypeScript は歴史的経緯から複数の書き方などがあるが「著者ならこうしてます〜」みたいなのがあって表面的な情報だけでなく意見が知れて良かった。

JS/TS 書いてて null と undefined どっち使ったらいいのかいつも迷ってたけど本では「言語使用上 undefined の方がサポートが厚いので筆者は undefined を推奨します」と書かれていたり、りあクト!では interface が推奨されてて疑問に思ってたけどこの本では type の方を推奨してて、やっぱそうだよねって思えて良かった。

TypeScript には馴染みのない型が多くて、 keyof とか typeof とか lookup 型とか mapped types らへんは読んでる時はなんとなくわかったけど、どういう場面で使うのか、実際に使いこなせるかというと微妙で、そういうのを頭に入れつつコードを書きながら理解を深めていったり、型に悩んだらこの本をもう一度参照するなどができたらいいかなと思った。ひとまずは TypeScript: Documentation - Utility Types をちゃんと使いこなしていきたい。

Promise は普通に使ってたけど race, allSettled, any は使ったことがなく初めて見た。

関数の返り値の型は、今では雰囲気で書いてたり、返り値の型を明示するのが面倒なので推論に任せていたけど、この本を通して意図して返り値の型を推論されたり明示して考えるべきというのを知れて良かった。「関数の中身が真実である」場合は省略し、「この関数はこの型の値を返すべきである」なら型を明示するべき(ただし全て書くべき派など様々な人間がいる)。

以下雑メモ


  • enum や namespace は現在は推奨されてない
  • プリミティブ型とオブジェクト型の2種類しかない
    • プリミティブ方は文字列、数値、審議地、BigInt、null、undefined、シンボルの7つ
  • TypeScript の言語使用上 undefined の方がサポートが熱ので undefined を推奨
  • == は異なる型の比較を行った場合、暗黙の型変換を行なってから両者を比較するので意図せず true となってしまうことがあり === を使うべき
  • 変数 ||= は 変数 = 変数 || 式 と同じ
  • スプレッド構文でオブジェクトをコピーする場合、ネストしたオプジェクトは同じオブジェクトを参照するので注意
  • 関数の返り値を省略するか明示するか意図して考えた方が良い
  • private と同じく # という書き方もある
  • lookup 型は Human["age"] のように指定できる
    • 型情報を再利用できるのが lookup 型の基本的な使い方
  • keyof 型はオブジェクトの方からそのオブジェクトのプロパティ名の型を得る機能
    • keyof T と書く
  • as const TypeScript 4.9のas const satisfiesが便利。型チェックとwidening防止を同時に行う
  • mapped types や conditional types で有用な機能は標準ライブラリに組み込まれており、Readonly や Partial などがある
  • default エクスポートは default という名前でエクスポートする機能
  • export type {} を使うと型としてのみ使用可能となる
  • import type {} もあり、こちらは型として import できる
  • Promise.race は複数の Promise から最初に成功or失敗したものを結果とする
  • Promise.allSettled は全ての結果が出るのを待ち {status: 'fulfilled'|'rejected|, value: 結果} を返してくれる
  • Promise.any はどれかが成功したら返す
  • dynamic import でモジュールを遅延読み込みできる