TypeScript では、メンバーを参照解除するときに使用する ! (感嘆符 / バン) 演算子とは何ですか? 質問する

TypeScript では、メンバーを参照解除するときに使用する ! (感嘆符 / バン) 演算子とは何ですか? 質問する

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になる可能性について文句を言わないで下さい」と伝える方法です。型チェッカー自体がその判断を行えない場合もあります。nullundefined

それは次のように説明されているTypeScript リリースノート:

新しい!後置式演算子は、型チェッカーがその事実を結論付けることができないコンテキストで、そのオペランドが null 以外かつ undefined でないことをアサートするために使用できます。具体的には、この操作は、およびを除外してx!の型の値を生成します。および の形式の型アサーションと同様に、非 null アサーション演算子は生成された JavaScript コードから単純に削除されます。xnullundefined<T>xx as T!

この説明で「アサート」という用語が使われているのは少し誤解を招くと思います。「アサート」というのは、開発者がアサートするという意味であり、テストが実行されるという意味ではありません。最後の行は、JavaScript コードが出力されないことを示しています。

おすすめ記事