例によって用語がややこしい。
- 型述語は、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 型」の形式、構文範疇としてしか存在してない。
- 型ガード: 実行時に型をナローイングするための述語関数。実際の関数。
- アサーション関数: 実行時に型をナローイングするための例外を出す関数。実際の関数。