web-dev-qa-db-ja.com

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の特徴であるようです。 しかし /トランスピュレーションはビッグバンを完全に無視したため、次のようなJSが発生しました。

if (node.parent.kind === ts.SyntaxKind.ObjectLiteralExpression) {
    return;
}

私のGoogleのfuはこれまでのところ私に失敗しました。

TSの感嘆符演算子とは何ですか、またどのように機能しますか?

237

それがnull以外のアサーション演算子です。 「この式はここではnullまたはundefinedになることはできません。したがって、nullまたはundefinedである可能性について文句を言わないでください。」時々、型チェッカーはその決定自体をすることができません。

説明されています ここ

型チェッカーがその事実を結論付けることができない状況では、新しい!修正後式演算子を使用して、そのオペランドがnullおよびundefinedでないことを表明することができます。具体的には、操作x!は、xnullを除外したundefined型の値を生成します。フォーム<T>xおよびx as Tの型アサーションと同様に、!のnull以外のアサーション演算子は、発行されたJavaScriptコードでは単純に削除されています。

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

354
Louis

ルイの答えは素晴らしいですが、私はそれを簡潔に要約しようと思いました:

Bang演算子は、そうでなければ要求される可能性がある "nullではない"制約を一時的に緩和するようにコンパイラーに指示します。 「開発者として、この変数を今すぐnullにすることはできません。

77