ltmemo

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

tags:
2022-05-06

ToC

何を学ぶか

TypeScriptは普段から業務でも使う言語で、また個人としても好きな言語なので、より深い知識をつけるために購入した
結論から言うと非常に良い本で、全ての章で学びがあった。著者の知識量に圧倒されるばかりである

TypeScriptを書く人はみんな読んだ方がいいんじゃないかと思った

特によかった章ごとにまとめる。そのほかはメモとして最後にまとめる

3章

常に扱うことになるオブジェクトの知識についての章
interfaceとtype定義での型定義と、そのどちらを使うべきか(基本はtypeで問題ないとされていた)について指針があったり
インデックスシグネチャの扱いづらさについても触れられていてよかった 動的な連想配列を扱うときは素直にMapを使おう

noUncheckedIndexedAccessが有効になれば防げるから~と思っていたけれど、実際扱いづらいところはあるのでそもそも使わない方法を考えるのがよいと学んだ
TypeScriptはJavaScriptのランタイムの挙動を捻じ曲げたりすることはできない

Object.keys がstring[]しか返さないのなんでやんと思っていたが、あれはそもそもstringしか受け付けないのね...

分割代入 [, , three, , five] = [1,2,3,4,5] のようにできると知らなかった。今までアンスコに逃がしていた

5章

クラスについての章

クラスは全然使ったことがなかったので、静的初期化ブロックとかnewシグネチャとか知らなかった

他にもprivateがTypeScript独自で、後から#によるprivate変数がJavaScript側に生えたのはわかっていたが、JSON.stringifyに通すと後者が消えるのは知らなかった
なんとなく知らないとハマりそうな挙動に感じる

class宣言は、型と変数を同時に定義する構文 と説明されていたのが非常にわかりやすくてよかった。classの定義が型にもなっててややこしいなぁと思っていたので

実際に使う機会は少なそうだったが、ここで説明されていた内容は多分初見だと面食らうタイプのものが多いように感じたので、
読みごたえがあり面白かった

6章

TypeScriptの型システムについて学ぶ章。一番面白かった
共変、反変の概念は難しかったのでメモに

wideningの挙動について詳しいのがうれしい

直和型がunion型だと思っていたけど厳密には違うらしい。タグ付きUnionで調べるとCにもあるのがおもろいな(タグ付き共用体)

switchのdefault節はしょってもエラーが出るの確かに。今までneverな変数に代入していたのは無駄だった...
tag付きUnionを絞り込む場合、default節自体が有用じゃなさそうだ

keyofやlookupのような主に型パズルで見るあれについても説明がある(T[K]をlookup型というのは知らなかった)

objectリテラルで、keyが必ずstringで扱われるの知らなかった。どおりでObject.keysがstring[]しか返さないわけだよ...
TypeScriptはランタイムの挙動は変えないんでしたね

stringを含むUnion型Tに、stringのみである制約をつけたいとき、T & stringでできる。覚えとくといいことありそう

メモ

部分型

簡単に書くならクラスAを継承したクラスBがあるとき

共変性と反変性

引数は反変であり、戻り値は共変である必要がある

この概念が本を読んだだけではまだしっくりこなかったので自分でも調べてみた
「~である必要がある」というより、この方が型安全である、という感じっぽい?
ある型Aが他の型Bの部分型である、ということについての理解が自分の中で言語化できていなかったので、それを学ぶよい機会になった

wiki共変、反変の概念がわかる

ただなんでサブクラスでは、引数が反変の方が型安全なのかいまいち理解しきれなかった

型クラス

型を学習していると型クラスという単語を見かけるが、どうやらTypeScriptにはなく、Rustにはあるらしい(traitがそう)
いまいち概念がわかっていないという前提でざっくり書く、
インスタンス化すると型になるのが型クラスらしい。クラスがインスタンス化するとオブジェクトになるのと近いイメージ
型の集合を定義するものというか、IntとFloatが属するNumという型クラスが作れて、Numには算術演算の関数が生えており、IntとFloatどちらにも適用可能
これだけ書くと基底クラスっぽさがあるな...いやでも型「クラス」なので間違いではないのか
ここで基底となった型クラスの制約を満たす型を定義できるということでね


最終更新: 2022-05-10