TypeScriptの型述語、型ガード、型アサーション関数、その他

例によって用語がややこしい。

  • 型述語は、value is string のような構文。タイピング述語、タイピング関係といったほうが良いが、「型述語」。これは、型ガード関数や型アサーション関数の戻り値位置に書く形式。
  • 型ガードが実は述語〈ブール値をとる関数〉で、未知の値が特定の型に所属するときtrue、そうでないとfalseを返す関数。この型ガード関数の戻り値の位置に型述語を書く。
  • 型アサーション関数も型ガードとほぼ同じだが、タイピング条件(型述語の条件)を満たさないと例外を投げる。型アサーション関数の戻り値宣言位置には asserts value is string のように書く。
  • 型アサーション関数の型述語の代わりに asserts arg と書くと、argに関して何事かをチェックして例外またはvoidを返す関数のこと。型のチェックに限らない。
  • 型ガードや型アサーション関数で、型を特殊化する(ことを保証する)ことをnarrow downという。
  • 困ったことに「型アサーション」は、型キャストの意味で、型を強制すること。引用:「型アサーションはコンパイラに「私を信じて!私のほうが型に詳しいから」と伝えるようなものです。」(https://typescriptbook.jp/reference/values-types-variables/type-assertion-as
  • 型アサーション関数は、単に「アサーション関数」と呼んで「型アサーション」と区別する(苦しい)。
  • 型キャストは実行時だと言う人もいるが、そうとも言えない。型アサーションはコンパイラ時。
  • 型アサーションは明示的な強制、コアージョンは暗黙に適用される強制。
  • 型アサーションと型アノテーションは違う。(名前 : 型) が型アノテーション。型宣言とは違う?
  • 型エイリアスは型定義。

まとめ:

  • 型エイリアス: 型定義 "type"
  • 型アノテーション: 型宣言・注釈 コロン
  • 型アサーション: コンパイラに指令 "as"
  • 型述語: 「名前 is 型」の形式、構文範疇としてしか存在してない。
  • 型ガード: 実行時に型をナローイングするための述語関数。実際の関数。
  • アサーション関数: 実行時に型をナローイングするための例外を出す関数。実際の関数。