typescriptを利用したNuxtのコードリーディングをしている中で「!」「?」がプロパティで使われていたが、何を示しているのかがよくわからなかった。
「?」が引数として使われるときは省略可能オプションということはわかっていた。

private Data1!: Data1Output
private Data2?: Data2Output
private totalCount: number = 0

「!」「?」がない場合

private totalCount: number = 0
定義時にnull | undefindの状態(初期値が記述されていない)とエラーになる
→初期値をいれないならどちらかをプロパティのあとに書かないといけない。

「!」

private Data1!: Data1Output
「!」はプロパティで定義した時はnull | undefind だけど後で空ならず値が入って使う
→定義時にはプロパティの初期値がなくても問題ない。ただ、利用するときにはnull | undefindではエラーが出るので値を入れなければいけない

「?」

private Data2?: Data2Output
「?」はnull | undefind の場合もある
→定義時にプロパティの初期値がなくても問題ない。利用するときにも値がnull | undefiindで問題ない

結論

簡単に言うと、「!」「?」どちらもも定義した時点では初期値がない状態(null | undefind)、「!」はそのあとに何かいれないといけない、「?」は入れなくても大丈夫。

元記事はこちら

typescriptのプロパティで使われる「!」「?」
著者:
@yutoun