Closed10

「プロを目指す人のためのTypeScript入門」を読むぜ

タピオカタピオカ

https://gihyo.jp/book/2022/978-4-297-12747-3

よかったところ

JavaScript, TypeScript の要所を押さえつつ、各種機能を使う上での心構えなども詳しく解説されているので、実践で十分使えるだけの情報量がある。

よくなかったところ

JavaScript 未経験者でも理解できるように JavaScript の解説などにもかなりの字数(体感的には 50% くらい)を割いているが、JevaScript 経験者にとっては既知の内容が多すぎて読みづらさを感じる。
また筆者は簡潔であることよりも正確であることに(やや過剰ぎみに)こだわっていて、補足的な説明がやたら多くて長い。 ここらへんも好みが分かれそう。

総合すると他のプログラミング言語にある程度精通しているが JavaScript, TypeScript は未経験という人が最短で TypeScript を業務で使えるようになるための書籍という感じ。
ただそもそも地に足つけて習得したい人は JavaScript と TypeScript を同時並行で学ぶのではなく分けて学ぶほうが効率的だとは思う。

タピオカタピオカ

第1章 イントロダクション

1.1 TypeScript とは ~ 1.2 TypeScript と JavaScript の関係

TypeScript って何が嬉しいんだっけ?という話。
変遷や周辺技術との関係性を交えて説明されていて初学者でも雰囲気が伝わりやすそう。

どんなに優れた人でもまったく間違えずにプログラムを書くのは難しく、ミスが発生するのは当たり前です。コンパイルエラーがあるほうがそのミスがすぐに発見される可能性が高くなり、ミスが残ってしまう(バグが発生する)ことが少なくなります。これにより、成果物のクオリティが高まります。これが静的型システム・型安全性の恩恵です。

わかる。

静的なチェックがあってもテストは依然として必要ですが、静的なチェックができるものはテストよりも静的チェックで行うべきです。場合にもよりますが、一般には静的なチェックのほうがテキストエディタやIDEによるサポートを高い反応速度で受けやすくなり、コードを書く・ミスを発見する・直すというサイクルをより高速に行えるからです。

わかる。

TypeScriptプログラムはランタイムの挙動が型情報に依存しないという特徴があります。

これは大事。

1.3 TypeScript の開発環境

TypeScript の開発環境構築から Hello World まで。
さすがにやることが多すぎて初学者だったらこのあたりでキレている。
Node バージョンマネージャーや package.json の説明は JavaScript である程度慣れているとスキップできるのでやはり JavaScript から段階的に学ぶ方がスムーズだと思う。
言語を学ぶ環境としてはもはや Deno でいいのでは?とも思うけど、実務ではまだ Node.js は避けて通れないので仕方ない。

タピオカタピオカ

第2章 基本的な文法・基本的な型

タイトルの通り基本的な文法・型のお話。
本当に基本なので TypeScript をある程度触っている人には目新しい情報は少ない。
初学者はこれ読めば基礎はあらかたさらえそうではある。
ただ説明が細かく重要度の高いものと低いものが混在しているのでちょっと読みにくい。

コラム7のセミコロンは省略できるという話、セミコロンを省略した際の弊害に一切触れてないのは少し気になった。

タピオカタピオカ

第3章 オブジェクトの基本とオブジェクトの型

これも基本的な内容。
スプレッド構文を使ったオブジェクトのコピーとかも紹介されていて実践的。

3.1 オブジェクトとは

deep clone するための structuredClone という HTML 標準の関数があるのは初めて知った。

3.2 オブジェクトの型

ほとんどの場合、interface 宣言は type 文で代用可能です。しかも type 文のほうがより多くの場面で使えるので、interface 宣言は使用せずに type 文のみを使うという流儀も有るようです(筆者もそうです)。

わかる。

インデックスシグネチャが結構古い機能であるという事情もあり、推奨できません。多くの場合は Map オブジェクトで代替できます。

たしかに。これは覚えておこう。

読み取り専用プロパティの宣言

readonly はあまり使ってないので使いこなせるようにしたい。

コラム10 typeof はいつ使うべきか

型上位の書き方のまま同じ文字列を2回書かなくて済む方法は存在しません。このような場合に値上位の書き方をすることになります。

同じ文字を2回書かなくて済むことと値上位の書き方をすることの論理的な繋がりがわからない。
「型と値が本質的に同じものを指す場合は値上位の書き方にするべき」ということなのかな?🤔

タピオカタピオカ

第4章 TypeScript の関数

割と読み飛ばした。

4.3 関数型の部分型関係

関数型の返り値の型は関数型の共変 (covariant) のいちにあると言い、関数型の引数の型は反変 (contravariant) の位置にあると言います。

ここらへんは全然知らないので別途調べてみても良さそう。

タピオカタピオカ

第6章 高度な型

6.7 更に高度な型

6.7.2 型述語(ユーザー定義型ガード)

asserts 引数名 is 型 の方の型述語はたぶん使ったことがなかった。
引数名 is 型 との使い分けの基準がどうなるのか少し気になる。

6.7.3 可変長タプル型

これも使ったことない。

6.7.6 組み込みの型を使いこなす

組み込みの型は頻出なのでパッと出るように覚えておきたい。
以下が紹介されていた。

Type Description
Readonly<T> オブジェクトのすべてのプロパティを読み取り専用にする
Partial<T> オブジェクトのすべてのプロパティをオプショナルにする
Required<T> オブジェクトのすべてのプロパティを必須にする
Pick<T, K> オブジェクトの特定のプロパティのみを残す
Omit<T, K> オブジェクトの特定のプロパティを除く
Extract<T, U> ユニオン型から特定の部分型のもののみを抜き出す
NonNullable<T> nullundefined の可能性を除く
タピオカタピオカ

第9章 TypeScript のコンパイラオプション

割と読み飛ばした。

このスクラップは2022/07/18にクローズされました