tslint ルールのソース コードを調べていたところ、次の記述を見つけました。
if (node.parent!.kind === ts.SyntaxKind.ObjectLiteralExpression) {
return;
}
!
の後の演算子に注目してくださいnode.parent
。興味深いですね!
まず、現在インストールされている TS バージョン (1.5.3) を使用してローカルでファイルをコンパイルしてみました。結果として得られたエラーは、バンの正確な位置を示していました。
$ tsc --noImplicitAny memberAccessRule.ts
noPublicModifierRule.ts(57,24): error TS1005: ')' expected.
次に、最新の TS (2.1.6) にアップグレードしたところ、問題なくコンパイルできました。これは TS 2.x の機能のようです。ただし、トランスパイルでは bang が完全に無視され、次の JS が生成されました。
if (node.parent.kind === ts.SyntaxKind.ObjectLiteralExpression) {
return;
}
私の Google スキルは今のところ役に立っていません。
TS の感嘆符演算子とは何ですか? また、どのように機能しますか?
ベストアンサー1
null
これは非 null アサーション演算子です。これは、コンパイラーに「この式はここではまたは にはなり得ないので、またはundefined
になる可能性について文句を言わないで下さい」と伝える方法です。型チェッカー自体がその判断を行えない場合もあります。null
undefined
それは次のように説明されているTypeScript リリースノート:
新しい
!
後置式演算子は、型チェッカーがその事実を結論付けることができないコンテキストで、そのオペランドが null 以外かつ undefined でないことをアサートするために使用できます。具体的には、この操作は、およびを除外してx!
の型の値を生成します。および の形式の型アサーションと同様に、非 null アサーション演算子は、生成された JavaScript コードから単純に削除されます。x
null
undefined
<T>x
x as T
!
この説明で「アサート」という用語が使われているのは少し誤解を招くと思います。「アサート」というのは、開発者がアサートするという意味であり、テストが実行されるという意味ではありません。最後の行は、JavaScript コードが出力されないことを示しています。