TypeScript 3.7 で注目すべき 3 つの新機能について簡単に説明します。

TypeScript 3.7 で注目すべき 3 つの新機能について簡単に説明します。

序文

TypeScript 3.7 が正式にリリースされてからしばらく経ちました。この期間中、現在のプロジェクトを TypeScript に移行しているので、リリースごとに特に注意を払うつもりです。

3.7 に含まれる新機能に関しては、以前のリリースと比較すると実際には比較的小規模なリリースですが、そこに含まれるいくつかの機能により、コードの品質自体が大幅に向上します。

オプションの連鎖

最初の機能は、オプショナル チェイニング演算子のサポートです。これは、オプショナル チェイニング演算子と翻訳する必要があります。もちろん、この翻訳はまだ少し奇妙だと思うので、今のところは英語のままにしておきましょう。

この機能は、まずは es2019 に搭載された新機能です。機能自体については、ご興味のある方はこちらを参照してください。

TypeScript は JavaScript のスーパーセットなので、この機能は事前に実装されることが予想されます。使い方は大まかに次のようになります。

?.b();

は以下と同等です:

もし(a)ab();
// または && ab()

たとえば、多層ネストの場合、b もオブジェクトであり、c() を呼び出し続けるには、次のようにします。

a?.b?.c()

しかし、このように記述したとしても、b() の b も null 値になる可能性があり、直接呼び出されると例外がスローされるため、安全ではありません。絶対的な安全性を確保するには、次のように記述します。

a?.b?.();

ここで、optional の意味を正しく理解しておく必要があることに注意してください。optional とは、型宣言で ? によって変更されることを意味します。つまり、型に null 値にできるプロパティが含まれていることを示します。つまり、?. は、型宣言自体に準拠していないプロパティでは呼び出されません。例:

インターフェースA {}

定数a: A = {};

a?.b?.(); // プロパティ 'b' はタイプ 'A' に存在しません

インターフェース A の宣言が次のように変更されない限り、

インターフェースA {
  b?: どれでも
}

この機能はプロジェクトにおいて非常に実用的な意味を持ちます。if アサーション ステートメントや && 演算子を少なく記述しても、同じ効果が得られます。

ヌル結合

中国語から翻訳すると、これは二重疑問符演算子と呼ばれ、その構文はまさに ?? であるため、実際には非常に説明的です。

この演算子の機能は、簡単に言えば、次のコードのように、null 値のデフォルト値を指定することです。

a = b || 'foo' とします

b が null の場合、|| 演算子の性質により、a の値が foo に割り当てられます。 ?? 演算子を使用して書き直すと、次のようになります。

a = b とします?? 'foo'

表面的には、両者に違いはないように見えますが、実際にはここには隠れた問題があります。つまり、null 値の概念は null と undefined だけを指すのではなく、false や 0 などの一連の論理的に偽の値も null 値としてカウントされるため、明らかに問題があります。例:

定数b = 0
a = b || 'foo' とします
// a は 'foo' です

この例では、b が本当に空の値 (null または undefined) の場合にのみ、a にデフォルト値が割り当てられると予想されます。a は 0 に等しいはずですが、実際の実行結果は foo です。これは、b = 0 であるためであり、|| 演算子の操作中に false として解釈されます。実際のプロジェクトで検証コード コンポーネントを作成したことがあります。残念ながら、この落とし穴に陥ってしまい、この問題のデバッグに長い時間を費やしてしまいました。

しかし、?? 演算子を使用すると、この問題は発生しません。

呼び出されていない関数のチェック

同じような問題に遭遇した人は多いと思います。効果的な命名規則がないため、実際のプロジェクトでは次のようにアサーション属性とアサーションメソッドが混在しています。

クラスA {
    isFoo(): ブール値 {
        false を返します。
    }
}

関数テスト(a: A) {
    もしa.isFooであれば{ 
        ...
    } 
}

ここで、a.isFoo を呼び出してアサーション値を取得することが目的であれば、明らかに間違いを犯しています。直接 if (a.isFoo) を使用するのではなく、if (a.isFoo()) を使用する必要があります。後者は構文レベルでは間違っていませんが、論理的な意味では true としてアサートされるためです。しかし、3.7 のリリース後、TypeScript はこの問題の検出を支援しようとします。

それにもかかわらず、属性の場合は isXXX、メソッドの場合は assertXXX など、アサーション メソッドとアサーション属性の統一された命名規則を開発することをお勧めします。

他の

その他の変更としては、次のような使いやすさの変更があります。

  • よりフラットなエラー レポート: 繰り返されるエラー ログの大きなセクションを、可能な限り 1 つのより正確で簡潔なエラー ログに圧縮します。
  • ファイルレベルでの@ts-nocheck: 以前のバージョンでは、この注釈はインラインレベルのみをサポートしていました。
  • 再帰型宣言: 型宣言で再帰構文を使用して、json型などのより複雑な型を宣言できます。
  • js ファイルの宣言サポートを提供し、js プロジェクトからの移行コストを削減します。

上記は、TypeScript 3.7 で注目すべき 3 つの新機能の詳細について簡単に説明したものです。TypeScript 3.7 の新機能の詳細については、123WORDPRESS.COM の他の関連記事にも注目してください。

以下もご興味があるかもしれません:
  • Typescript での infer キーワードの使用に関する詳細な理解
  • TypeScript の Enum が問題となる理由
  • TypeScript をインストール、使用、自動コンパイルする方法に関するチュートリアル
  • Vue の新しいパートナー TypeScript クイックスタート実践記録
  • TypeScript でオブジェクト キーの値の範囲を制限する方法
  • TypeScript のマップされた型とより優れたリテラル型推論について説明します。
  • TypeScript 2.0 マーク付き共用体型の詳細な説明
  • TypeScript 関数の定義と使用例のチュートリアル

<<:  Linux で Nginx 1.16.0 をインストールするための詳細なチュートリアル

>>:  MySQLで日付を比較する方法の詳細な説明

推薦する

JavaScript と JQuery フレームワークの基本チュートリアル

目次1. JS オブジェクトDOM –1、機能–2、テスト3. jQuery –1. 概要–2、使用...

MySQLカスタム変数の概念と特徴

MySQL カスタム値は、値を保存するための一時的なコンテナです。サーバーへの接続がアクティブである...

Docker での FastAPI デプロイの詳細なプロセス

Docker 学習https://www.cnblogs.com/poloyy/p/15257059...

Dockerコンテナでは、イメージを簡素化してサイズを縮小する方法を詳しく説明しています

目次1.画像レイヤーの数を減らす1. 命令の統合2. 多段階ビルド3. スクワッシュ機能を有効にする...

Dockerに関するよくある質問

Docker はポートを IPv6 にのみマッピングし、IPv4 にはマッピングしません。 dock...

Webスキル: 複数のIEバージョンの共存ソリューション IETester

私のおすすめ複数のIEバージョンの共存のためのソリューション以前に IE6、IE7、IE8 の共存に...

CSS 表示テーブルの適応的な高さと幅の問題の解決策

定義と使用法display プロパティは、要素が生成するボックスのタイプを指定します。例示するこの属...

MySQL セレクトキャッシュメカニズムの使用に関する詳細な説明

MySQL クエリ キャッシュはデフォルトでオンになっています。ある程度、クエリの効果は向上しますが...

MySQLがフルテーブルスキャンを実行するいくつかの状況

目次ケース1:ケース2:ケース3:簡単にまとめると:過去 2 日間で、完全なテーブル スキャンを引き...

Nginx でバージョン番号を隠したり偽造したりする方法

1. デフォルトでアクセスするには、curl コマンドを使用します。 # curl -I http:...

CSSスタイルは、テキストが長すぎる場合に省略記号を表示する問題を解決します

1. CSSスタイルは、テキストが長すぎる場合に省略記号を表示する問題を解決します1. 一般的なスタ...

MySQLのデフォルトのソートルールに基づく落とし穴

MySQL のデフォルトの varchar 型は大文字と小文字を区別しません (insensitiv...

HTML+SassはHambergurMenu(ハンバーガーメニュー)を実装します

先日、外国人の方がHTML+CSSを使ってHamburgerMenuを実装している動画を見ました。最...

DockerでLNMPアーキテクチャを展開する方法

環境要件: IPホスト名192.168.1.1ノード1プロジェクト計画:コンテナネットワークセグメン...

Vueプラグインの詳しい説明

要約するこの記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS....