TypeScript のコードを見ていたときのこと

fn(value!)

みたいなコードがありました
TypeScript の ! って JavaScript の ?. の ? みたいなポジションだと思ってたのですが違ったようです
!. でまとまってる必要はなくて ! だけの単体で使えて 直前の式の nullable を解除するようです

任意の式の末尾に ! が書けるようです
それって JavaScript の構文と競合するようなしないような

JavaScript での ! は式の前に書く単項演算子です
! の次は式である必要があります
一方 TypeScript の ! は式の末尾に書きます
競合するには 「expression expression」 が有効でないとだめです
「(() => {}) ``」 はどちらも式で満たしてますが特殊なもので後者はテンプレートリテラルである必要があります
! が入ることができないので競合できないです

意外と大丈夫なのでしょうか

1 つ特殊なケースで競合を見つけることができましたが 構文的に発生する場所でどっちかが明確なので問題にはならないものでした
そのケースというのはこれです

yield!+1

ひとつめの解釈方法はこうです

function* gen() {
yield !+1
}

このときの yield はキーワードで function*() {} の中でのみ書けます
yield false と同じです

もうひとつはこれです

const yield = 1
yield! + 1

function*() {} の外なら yield を変数に使えるので 変数に ! をつけたものと 1 との足し算です

function*() {} の中か外かで完全に分かれるので競合にはならないです
あと strict mode なら yield は変数に使えないです