いろいろあって毎回説明するの大変なのでまとめておきます.
型変換 (type conversion)
基本的には明示的 / 暗黙的といった手段によらず, ランタイムの値を別の型に変換することを指していると思います. ランタイムの値が変わるのだから, 結果として静的な方の型も変わることにはなります.
JavaScript / TypeScript でいうと, typeof x === "number" な x に対して String(x) と明示的に変換することもできるし, "foo" + x のように (ここでは数値を文字列の文脈で使うことで) 暗黙的に変換されることもあります.
型キャスト (type casting)
基本的には明示的な手段を使って, ある値を特定の型の値として使えるようにする・そう表明すること全般を指しているかと思います. 多くの場合ランタイムの値の変換を伴いますが, アップキャスト / ダウンキャストに代表されるようにランタイムで値の変換は必ずしも行われないケースもあり, なんにせよその型の値として使えるようになるという部分が重要そうです. もしかしたら暗黙的な型変換のこともキャストと呼ぶこともあるかもしれないですが, 私はあんまり聞いたことはないかも.
JavaScript / TypeScript でいうと, String(x) はキャストと呼ぶけれど, "foo" + x での暗黙的な型変換をキャストと呼ぶ人はあんまりいなさそう ("" + x 全体を String(x) と同等のキャストと呼ぶことはあります).
また TypeScript の t as T も (ランタイムの値の変換のない) 型キャストの一種と呼べそうですし, 実際ダウンキャストするケースではこれを使いますが, ランタイムで値が変換されるという誤解を招きやすいため, 一般にこう呼ぶのはおすすめはしません.
型強制 (type coercion)
これは知っている限り二種類ありそう.
一つは型変換と同じものを指すケースで, 特に MDN の type coercion のページで紹介されているように暗黙的な型変換のみを指すことがあります.
対してもう一つ, Haskell などではランタイムの値を変換することなく静的な型だけを別のものに変える操作をこう呼ぶことがあります (例: Data.Coerce).
TypeScript の t as T も役割はほぼ同じなので, その意味では type coercion とも呼べそうですが, 前述の暗黙の型変換と混同される恐れがある (特にググるとそっちが最初に出てくる) 点には注意してください.
型アサーション (type assertion)
一般には, ある値がその型であると表明・主張し, 静的または動的に主張が妥当かどうかを検査するという感じにまとめられそうです. ランタイムの変換は行われなくて, 検査に失敗したらエラーが発生するという挙動が想定されそう.
TypeScript の t as T の正式名称は type assertion となっています (出典).
動的な検査は全く行われませんが, 静的検査は部分的に行われていて, 以下のように全く無関係の型と主張するような明らかに間違っているケースについてはコンパイルエラーになります.
一方でダウンキャストについては特にエラーにならず, この点では type coercion の二つ目と同等の挙動です.
declare const x: number; x as string; // コンパイルエラー declare const y: { foo: number }; y as { bar: string }; // コンパイルエラー y as { foo: number; bar: string }; // エラーにならない
最近 Bun が AoT で type assertion を型変換にコンパイルしよう的なことを言っていて (出典), なんというか無頓着だなあと思いました.
型表明 (type ascription)
文ではなく式の中に型注釈 (type annotation) を直接書けるようなもので, ある値が特定の型であることを表明し, 静的に検査を行います. 型推論の結果が一意に定まらない場合などに明示的に型を宣言するようなケースでよく使われ, 普通は式の型は宣言したものになります.
性質的に型注釈とほぼ同じものであることから, 構文も同じ記号が使われていることが多いように思います.
例えば Scala や Haskell では t: T や t :: T です.
TypeScript の t satisfies T は機能的に近いものに見えます (特に t as T と比べて静的検査が確実に行われるという点で) が, 必ずしも式の型が宣言した型 T にはならない (原則としては元々の t の型のまま. ただし t の型は宣言されている T を元に推論されることはある) という違いがあります.
Flow が type casting と呼んでいるものは機能的には type ascription 相当のものです.
昔は型注釈と同じ記号で (t: T) という構文を使っていたのですが, ある時 TypeScript の type assertion に寄せて t as string という構文になりました.
なんというか無頓着だなあと思いました.
まとめ
それぞれ一般的に理解されている共通認識はありつつも, 細かいところは文脈や使っている言語による部分もあるので, まあいい感じにやりましょう.