プロを目指す人のための TypeScript 入門
読了:
書籍情報
通称ブルーベリー本
他の人の感想
あわせて読みたい
TypeScript についての私のバックグラウンド
TypeScript についての学習はわかめさん本が出版されたときにそれを読んで以来という感じで実質初心者 JavaScript は一時期仕事でそこそこ使ってたので古い (具体的には ES2015 まで) 機能についてはまあまあ知ってるくらい
普段は Kotlin で Android アプリ開発をしてることがほとんどだけど、仕事の都合で TypeScript で書かれた諸々のアプリのコードを読むことはある
感想
// TODO
/icons/hr.icon
第1章 イントロダクション
TypeScript は"JavaScript + 静的型付け"
JavaScript も実行時の値に "型" はあるけど (型タグっていうんだっけか?), TypeScript で与えられる "静的型" とは異なるので区別しよう
TypeScript の型システムは表現力が豊かだよ
6章で紹介される内容だったり uhyo さんが Qiita とかで書いた記事で紹介されてるやつだったり他ではあまり見ないような概念がある
取り扱うトピックの歴史的背景に触れている本は個人的に好印象
自分が追いかけてた頃から色々あったしだいぶ様子が変わったことがわかる
TypeScript の型チェックの話
TypeScript プログラムはランタイムの挙動が型情報に依存しないという特徴があります。
TypeScript の静的型はあくまで TypeScript コンパイラの型チェックのための情報で、型注釈 (というかコンパイル) によってランタイムの挙動に影響を与えることはない
e.g. Java とかであるような関数オーバーローディングは TypeScript には存在しない
これはコンパイル時に引数の型によって呼び出しの意味を決定する
TypeScript 的にはシグネチャの違いが型のみだと関数定義の重複になっちゃう
型注釈を抜いた JavaScript としてのコードで考えると function foo(arg) だからそうだね、という感じ
TypeScript は ECMAScript の proposal で stage 3 に到達した機能が (先行して) 取り入れられる
ECMAScript 側の本採用は stage 4
初期は TypeScript 独自機能があったけど途中で方針が変わって新しく導入しないようになった
著者的に使用を推奨しないし、この本でも扱わない
開発環境構築
Kotlin/Java だったら IntelliJ IDEA で project 作ってドン、みたいなのと比べるどステップが多いねという話はわかる
まあでもそれぞれの作業やツールの処理は速いから時間的にはトントンじゃない? 知らんけど
第2章 基本的な文法・基本的な型
Speaking JavaScript で見たような話 + ES2015以後に追加されたものと静的型の話って感じ
文と式
sentence なんだ (statement で覚えた並感)
式文 (expression statement)
<expression>; みたいなの
文が入ることが期待されるところに式だけを入れても文として成り立つよ、ということ
Primitive 型
精度と BigInt (bigint) とパフォーマンス
BigInt には number 型の NaN に相当するものがない
変換できないものは全部実行時エラーになる
BigInt の falsy value は 0n
演算子
?? 演算子
二項演算子
x ?? y において x が null or undefined の場合のみ y が評価され、 y を返す
x が falsy でも x を選ぶ点が || と異なる
制御構文
Block が文であるおかげで構文の仕様がシンプルになってるという話
1つだけの文も複数の文も置ける場所は、後者を {} で表せばどちらも「1つの文」として仕様を記述できる
なるほどね
いきなり switch () {} の {} は block 文じゃないよ〜って言われてしまった... (それはそう)
第3章 オブジェクトの基本とオブジェクトの型
オブジェクトの省略記号は個人的に記述の一貫性が失われて読みにくくなるような気がするけど受け入れられてるんだなあ
まあオブジェクトリテラルの見通しの良さが優先されてほしいという気持ちはわかるかも
スプレッド構文 (spread syntax) はオブジェクトのコピーを作るのに使われるが、オブジェクトを property に持つ (-> nested object) 場合、 nested object はコピーされずに同じ値を参照することになる
Nested object までコピーする標準的な方法は今のところない
Web ブラウザ上では structuredClone が使えるかも
あとはそういうライブラリを使うとか
型
{ <property>: <type>; } という形式、オブジェクトリテラルと似ているので紛らわしいかもしれない
type 文でオブジェクト型に名前をつけられる
オブジェクト型以外にも primitive 型の別名とかにも使える
というかどんな型に対しても type 文で名前をつけられる
名前をつけるだけ (区別されない) なので Kotlin でいうと type alias みたいな存在
interface 宣言
こっちはオブジェクト型しか作れない
現代では type で十分っぽい
type ではできなくて interface しかできないものに declaration merging というのがある
インデックスシグネチャ
特定の型の任意の property を取れるオブジェクトを宣言できる
やばそう
やばかった (コラム9)
noUncheckedIndexedAccess compiler option で抑制可能
Property に装飾するやつ
<property>?: optional
readonly <property>: 読み取り専用 (あとで再代入できない)
typeof 増えとる
部分型
Structural subtyping
大雑把に言えば「構造上の重なり」による関係、みたいな
TypeScript はこっち
Nominal subtyping
OOPL で class なんかで型を表現するような言語はこっち
3.3.2: 重なる部分が supertype に収まれば良いので重なる property も部分型の関係でいいんだね、それはそう (完全一致しか頭になかった)
型引数
Kotlin で言うところのデフォルト引数の機能が型引数にもついてるけど、引数名指定ができないので左からしか型を指定できない
オプショナルな型引数の後にオプショナルでない型引数を宣言することもできないので必ず「必須 -> optional」という順番で定義しないといけない
それはそう
Array