プロを目指す人のためのTypeScript入門 読書メモ⑩ 第6章(2)
■ 思ったこと
最近メガテン3やってる、今ニヒロ機構!つよいぞスカクジャ、育ち切ったアマノウズメ嬢を悪魔合体させるかが悩み。
■ 第6章 高度な型(6.2~6.2.5)
リテラル型とはなんだ
- プリミティブ型 = 基本的な型(string、number、boolean、undefinedなど…)をさらに細分化したのがリテラル型
- おさらい!リテラルは何らかの値を生み出すための式のことね!えーと、その型というと?
- ・・例えば、type文は型に別名をつける文だね。なので、
type FooString = 'foo';
"なんてやればfoo型が作れちゃうのよ、これは"foo"という文字列のみが属する文字リテラル型!違うの入れると「型 '"hoge"' を型 '"foo"' に割り当てることはできません」なんて怒られちゃうよ! - 今作ったfoo型がまさにリテラル型、リテラルをそのまま型として使えるちゅーわけだね
- ややこしいが、"foo"はリテラルとしてみればfooを表す式だし、リテラル型としてみれば"foo"しか入らない型になる
- ちなみにtype使わないで
const foo: "foo" = "foo" ;
でもOK
リテラル型は、4種類ある!
- ズバリ、文字列・数値・真偽値・BinIntのリテラル型でしょう
- こいつらも先ほどのfoo型よろしく、リテラルをそのまんま型にする構文の使い手
- ちなみに、リテラル型は普段は意識してないだろうが、型推論で結構登場してたのよ?
const number = 0; //これ!変数number は0型!! const number: number = 0; //これだとnumber 型
- そうだったのか・・・!!定数は再代入できないってもしかしてそゆこと??
テンプレートリテラル型
- こいつは文字列型の一種
- てか、テンプレートリテラル自体は覚えてる??「``」で囲われた文字列リテラルのこと!これが型になるのだろう
- テンプレートリテラルといえば、変数を
${式}
で持てたけど・・今回は式ではなく型を持つ!つまり、${string}
は文字列リテラルを表す式じゃなくて、stringを設定しろの型ということ! - `今日は${string}日`というテンプレートリテラル型がありましたら、必ず「今日は${string}日」という文字列を入れる、それだけさ
ところで、リテラル型はユニオン型と合わせると良いみたい?
- 学んだ通り、リテラル型は型に特定の値しか入らなくするけれど、引数で使う意味はあんまりない(固定値だし…)
- そこで、リテラル型をユニオン型にしてあげれば!まるでフラグのように扱える。文字列なのでパっとみ分かりやすいよ
リテラル型の・・wideningって何!?
- そういう挙動がある
- まず、型推論は常に行われている
- そのうえで、
const foo = "foo"
であれば、もう再代入はしないと判断されてfoo型、let foo = "foo"
だと、再代入される可能性もあるしstring型(=プリミティブ型)に変換される!これがリテラル型のwideningじゃい!! - オブジェクトリテラル作るときも型推論してもらってたけど、結構wideningされてる、readonlyでなければ再代入される可能性あるので…
■ 感想
リテラル型、奥が深い!!6章!マジで長くなりそう!ていうか…今やたら多幸感がある!!次の案件かなり重そうで不安しかないはずなのに。これがふわふわハッピーでしょうか?我が最愛の神(Yu&Rei)よ…