ペロハム大学

ヤルゾー

プロを目指す人のための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)よ…