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で日付を比較する方法の詳細な説明

推薦する

js 配列エントリ() 反復メソッドを取得する

目次1.entires() メソッドの詳細な構文2.entires() メソッドの一般的な使用法と注...

Ubuntu 16.4 で完全に分散された Hadoop 環境を構築するための実践的なチュートリアル

序文この記事は主にubantu 16.4 Hadoop完全分散構築に関する関連コンテンツを紹介し、皆...

インタラクティブデザインでページングと読み込みのどちらを選択するかについての説明

この記事の著者@子木yoyoが個人ブログに投稿したものです。 Web ページでもモバイル アプリでも...

Dockerバッチコンテナオーケストレーションの実装

導入Dockerfile ビルドの実行は、単一のコンテナの手動操作です。マイクロサービス アーキテク...

Bash スクリプトを使用して Linux のメモリ使用量を監視する方法

序文Linux システムのパフォーマンスを監視するために使用できるオープンソースの監視ツールが市場に...

MySQL 8.0 の新機能の落とし穴と解決策についての簡単な説明 (要約)

1. ユーザーを作成して承認するMySQL 8.0 では、ユーザーの作成と認証が以前とは異なります...

.html、.htm、.shtml、.shtm の違いと関連性について簡単に説明します。

ご存知のとおり、私たちが毎日閲覧する Web ページ、Web サイト、または Web ページには独自...

Linux でも利用できる人気の Windows アプリ 10 選

データ分析会社Net Market Shareによると、Linuxデスクトップオペレーティングシステ...

Linux でタイムアウト付きの接続関数を試す

前回の記事では、Windows でタイムアウトを試してみました。この記事では、Linux で試してみ...

コンテンツウェブページの画像プレビューのデザイン

<br />以前、「コンテンツページ番号のプレビューナビゲーション」と「写真プレビューナ...

JavaScriptタイマーの詳細な説明

目次簡単な紹介間隔の設定説明するパラメータ戻り値使用法タイムアウトの設定説明するパラメータ使用法:タ...

VUE 入門 イベント処理の学習

目次1. 関数バインディング2. パラメータと$eventを使用する3. 1つのイベントに複数の関数...

MySQL における大規模オブジェクトのマルチバージョン同時実行制御の詳細な説明

MySQL 8.0: InnoDB のラージ オブジェクトに対する MVCCこの記事では、MySQL...

insert と select を組み合わせて、「データベース内のフィールドの最大値 + 1 を挿入する」メソッドを実装する

この記事はmysqlデータベースです質問 1 表 1 のデータを表 2 にインポートします。表 1 ...

JSに関する7つの面接の質問、あなたはいくつ正しく答えられますか

序文JavaScript では、これは関数呼び出しコンテキストです。この動作が非常に複雑であるからこ...