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

推薦する

Zabbix でフィルターを使用して監視を実装する方法

最近、監視機器の作業をしていたとき、ポートがダウンしているというアラームが常に出ていました。データを...

MySQLのバッファプールの詳細な説明

MySQL のデータはディスクに書き込む必要があることは誰もが知っています。ディスクの読み取りと書き...

MySQL 8.0.20 圧縮版のインストールチュートリアル(画像とテキスト付き)

1. MySQL ダウンロード アドレス。 http://ftp.ntu.edu.tw/MySQL...

Ubuntu での mysql のインストールと使用 (一般版)

Ubuntu のバージョンに関係なく、MySQL データベースのインストールは基本的に同じです。具...

nginxで静的リソースを公開する方法

ステップ準備した静的リソースファイルを指定されたフォルダに配置しますnginx 設定ファイルを変更す...

HTML テーブルタグチュートリアル (27): セルの背景画像属性 BACKGROUND

セルの背景画像を設定でき、任意の GIF または JPEG 画像ファイルを使用できます。基本的な構文...

MySQL データベース ターミナル - 一般的な操作コマンド コード

目次1. ユーザーを追加する2. ユーザー名とホストを変更する3. パスワードを変更する4. ユーザ...

UTF8 でエンコードされた Web ページにファイルが含まれている場合の、ページの前の空白行の解決方法

<br />このページはUTF8エンコードを使用しており、ヘッダーとフッターはテンプレー...

ホバー生成の境界線によって生じる要素の移動を解決する方法

序文hover疑似クラスが要素に境界線を追加すると、要素内のコンテンツがずれることがあります。box...

純粋な CSS を使用して 3D 回転効果を実装するサンプル コード

3D効果を実現するには、主にCSSのpreserve-3dプロパティとperspectiveプロパテ...

データベース管理における 19 の MySQL 最適化方法

MySQL データベースを最適化すると、データベースの冗長性を削減できるだけでなく、データベースの実...

nginx のスムーズな再起動を実装する方法

1. 背景サーバーの開発プロセスでは、新しいコードや構成をロードするためにサービスを再起動することが...

HTMLの基本構造を包括的に理解する

HTML入門ハイパーテキスト マークアップ言語: ハイパーテキスト マークアップ言語ハイパーテキスト...

JavaScript のスプレッド演算子とレスト演算子の違いの詳細な説明

目次レスト演算子とは何ですか? JavaScript 関数では REST 演算子はどのように機能しま...

MySQL の完全バックアップ中に特定のライブラリを除外する方法

MySQLの完全バックアップを実行するときは、--all-databaseパラメータを使用します。例...