「TypeScriptの型入門」で手を動かす - その11

今日は「「TypeScriptの型入門」の「object型と{}型」から手を動かします!

qiita.com

プレイグラウンドで手を動かす

object型と{}型

  • object型とは「プリミティブ以外の値の型」
  • オブジェクトのみを引数に受け取る関数を表現するための型
    • Object.create()
  • {}という型
    • 何もプロパティが無いオブジェクト型
    • 構造的部分型により、{ foo: string}のような型も{}として扱える
    • 任意のオブジェクトを表す型としては使えない
      • const o:{} = 3 とか受け付けてしまう
    • undefinedとnullは受け付けない
    • {}はundefinedとnull以外はなんでも受け入れるとても弱い型

weak type

  • オプショナルなプロパティしかもたない型のこと
  • 特殊な処理が行われる
    • 以下は本来はweak typeの型として妥当なはず
      • オプショナルなプロパティをどれも持たない
      • 型で定義されていない余計なプロパティがある
        • 構造的部分型なので。余計なプロパティはあってもよい。
    • weak typeでは特殊な制限がかかる
      • weak typeが持つプロパティを1つ以上持って無いとエラー
  • オプショナルプロパティはオプションを表現するオブジェクトで利用されるので、この制限はむしろかかってほしい

unknown

  • 本当に最も弱い型
    • {}の後に追加されたのかな
  • top型、never型のちょうど逆、全ての型を部分型として持つ、部分型関係の頂点
  • 任意の型を受け付けるという意味でanyと同じ
    • できることが制限される分、anyよりは良い選択肢
  • unknown型は、できることが制限される
    • 数値の足し算もできない
    • typeofで型の絞り込みが必須なので、その点anyよりは良い

unknown型とvoid型の意外な関係

  • unknown型とvoid型は似ているところがある
  • 関数の返り値の型としてvoid型が登場する場合
    • void型は返り値が無い関数の型で、undefinedは入ることができたかな
      • void型で定義された変数に直接"123"とか値入れるとエラー
  • なんでこんなことができるのかはピンときていない
    • 関数を実行したいが、返り値に興味ない場合というのを表現できるらしい
    • ()=>func1() のようなアロー関数経由でfunc1を実行したい
      • 本来なら()=>numberかもだが、返り値に興味ないので()=>voidとして扱いたい
    • 確かに、あるような気もする。ライブラリの関数実行して返り値は使わない場合とか
  • というと、void型はundefinedが入っているとは限らず、何が入っているかわからない
    • つまり、unknown型と同じ、制限もかかっている

void型は何が入っているかわからない型、void型を返す関数の型といっても、値を返す関数を代入可能、ちょっと特殊?な動きだなぁ。

これで実現ができると言っていることは、たしかにそうだと思うのだけど。

今日は一旦ここまで、次は「typeof」から手を動かします!