1. ホーム
  2. typescript

[解決済み】Typescriptで、! (エクスクラメーションマーク/バン)演算子でメンバを再参照するのは?

2022-02-04 22:42:57

質問

tslintルールのソースコードを見ていたら、以下のような記述がありました。

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

ここで ! 演算子の後に node.parent . 面白い!

まず、現在インストールされているTSのバージョン(1.5.3)で、ローカルにコンパイルしてみました。その結果、エラーはbangの正確な場所を指していました。

$ tsc --noImplicitAny memberAccessRule.ts 
noPublicModifierRule.ts(57,24): error TS1005: ')' expected.

次に、最新のTS(2.1.6)にアップグレードしてみたところ、問題なくコンパイルできました。ということで、TS2.xの特徴のようです。 しかし を指定すると、トランスパイレーションでbangが完全に無視され、以下のようなJSになります。

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

私のGoogle fuは今のところ失敗しています。

TSのエクスクラメーションマーク演算子とは、どのようなものなのでしょうか?

どのように解決するのですか?

それは、非NULL断定演算子です。これは、コンパイラに「この式はNULLにできない」と伝えるためのものです。 null または undefined である可能性を否定するものではありません。 null または undefined ." タイプチェッカー自身がその判断を下せないこともあります。

説明されている こちら :

新しい ! ポストフィックス式演算子は、タイプチェッカーがその事実を結論づけることができないコンテキストで、オペランドが非NULLかつ非定義であることを主張するために使用することができます。具体的には、演算子 x! の型の値を生成する。 xnullundefined を除く。形式のタイプアサーションと同様に <T>xx as T を使用します。 ! 非 NULL のアサーション演算子を削除するだけでよい。

その説明の中で、quot;assert"という用語の使い方が少し誤解を招くと思います。これは、次のような意味での「assert"」です。 開発者はそれを表明している テストが実行されるという意味ではありません。最後の行は、確かにJavaScriptのコードが出力されないことを示しています。