1. オプションの連鎖v3.7から利用可能 これは、ネストされたデータにアクセスしようとするときに問題となる点であり、データがネストされるほど、コードが煩雑になります。 次の例では、アドレスにアクセスするには、data.customer.address をトラバースする必要があり、データまたは顧客は未定義である可能性があるため、この例では && 演算子または同様の手法を使用して各定義レベルをトラバースするのが一般的です。 これで、.? 演算子を使用してデータに選択的にアクセスできるようになりました。この方法では、まだ定義されていない親オブジェクトがある場合、実行時にクラッシュするのではなく、チェーン内の任意の場所で undefined が返されます。 // v3.7 より前 if (data && data.customer && data.customer.address) { const {アドレス} = data.customer const fullAddress = `${address.street}, ${address.city}, ${address.state }${address.zipcode}` } // バージョン3.7 // データアクセス 定数アドレス = データ?.顧客?.アドレス const fullAddress = `${address?.street}, ${address?.city}, ${address?.state } ${address?.zipcode}` // 配列 customers?.[0]?.['address'] にも適用されます // メソッドが定義されているかどうかを確認し、customer.approve?.() を呼び出します。 2. NULL値の結合v3.7から利用可能 null 合体演算子は || の代替であり、左側が null または未定義の場合に右側の式を返します。これは || とどう違うのでしょうか? || は基本的に JavaScript のブール OR 演算子であり、短絡を利用して最初の false でない値を返そうとします。有効な入力として必要な場合に数値 0 または空の文字列が false とみなされるため、予期しない結果が生じる可能性があります。例を使って説明してみましょう。 // 以前は passPhrase = data.inputString || 'Unknown' // は "" (空の文字列) を受け入れませんでした passCode = data.number || '-1111' // 0 は受け入れられません rememberMe = data.rememberFlag || true // 常に true になります!!! // これで passPhrase = data.inputString ?? 'Unknown' // inputString が未定義の場合にのみ Unknown になります passCode = data.number ?? '-1111' // 0 を渡すことができます rememberMe = data.rememberFlag ?? true // false は有効な値です こうすることで、未定義の値と false の値を明確に区別できます。 3. 再帰型エイリアスv3.7から利用可能 現実世界の多くのデータ型は再帰的です。たとえば、階層型データを処理しようとすると、同じ種類のデータのパターンが繰り返されていることがわかります。 jsON は良い例です。これは本質的にハッシュ マップであり、ハッシュ マップ自体に別のマップまたはマップの配列を含めることができます。 v3.6 より前では、単純な jsON 型を定義する必要がある場合は、次のようにする必要がありました。 インターフェースJSONObject { [x: 文字列]: JSONValue; } インターフェース JSONArray は Array<JSONValue> を拡張します { } タイプ JSONValue = 文字列 | 数値 | ブール値 | JSONObject | JSONArray 1 行目と 2 行目の型を 3 行目のようにインライン化しようとすると、次のエラーが発生する可能性があります: 型エイリアス JSONValue が循環的に自身を参照しています。 この問題は v3.7 で効果的に解決されており、次のように簡単にコーディングできます。 型 JSONValue = 文字列 | 数値 | ブール値 | { [x: 文字列]: JSONValue } | 配列<JSONValue> 4. アサーション署名v3.7から利用可能 TypeScript には、JavaScript の typeof 演算子および instanceOf 演算子とうまく連携する型ガードがあることを知っておく必要があります。これは、関数の引数に前提条件を追加して、特定の型に制限する場合に便利です。 与えられた入力が日付であることを確認するための型ガードを追加し、そこから年を抽出して、上記のすべてを使用するコードを記述してみましょう。 関数 isDate(input: unknown) : 入力が Date であることを確認します { if (日付のインスタンスを入力) 戻る; それ以外 throw new Error('入力は日付でなければなりません!'); } 関数 getYear(入力: 不明): 数値 { isDate(入力); return input.getFullYear() // TypeScriptsは入力がDateであることを認識します } console.log(getYear(新しい日付('2019-01-01'))); コンソールにログ出力します。 上記のコードは問題ないように見えますが、TypeScript は依然として、getFullYear が不明な型では使用できないというエラーを出力します。 TypeScript 3.7 以降では、asserts という新しいキーワードが追加され、コンパイラーがアサーションから正しい型を認識できるようになりました。アサーション関数の場合は、戻り値の型の代わりに、asserts <param> as <type> を追加する必要があります。 この方法では、アサーションが成功した場合、TypeScript はパラメーターが以前に定義された型であると想定します。変更されたコードは次のとおりです。 関数 isDate(input: unknown) : 入力が Date であることを確認します { if (日付のインスタンスを入力) 戻る; それ以外 throw new Error('入力は日付でなければなりません!'); } 関数 getYear(入力: 不明): 数値 { isDate(入力); return input.getFullYear() // TypeScriptsは入力がDateであることを認識します } console.log(getYear(新しい日付('2019-01-01'))); コンソールにログ出力します。 5. Promisesにより良いフィードバックを提供する3.6 以降の改善点 次に示すように、コード内で Promise を直接使用し、await または then の使用を忘れることはよくある間違いです。 インターフェース顧客{ 名前: 文字列 電話番号: 文字列 } 関数 getCustomerData(id: string): Promise<Customer> を宣言します。 関数 payCustomer(customer: Customer): void を宣言します。 非同期関数f(){ 定数顧客 = getCustomerData('c1') 支払う顧客(顧客) } 以前の TypeScript では Promise について何も認識できず、次のように Promise とは関係のないエラー メッセージが表示されていました。 v3.6 以降、コンパイラは実行すべき Promise を提案できるほど賢くなりました。最新のコンパイラが同じエラーをどのように処理するかに注意してください。 あまり詳しく説明せずに、いくつかの機能について簡単に説明しましょう。 6. Unicode識別子v3.6以降で利用可能 const hello = "世界" 上記のコードは以前のバージョンの TypeScript ではコンパイルされない可能性がありますが、より広範な Unicode セットから識別子を定義できるようになりました。 7. 増分コンパイルv3.4以降で利用可能 大規模なプロジェクトで TypeScript を使用している場合、そのプロジェクト内のファイルに加えた変更にコンパイラが応答するまでに長い時間がかかることがあります。変更されたファイルを増分的にコンパイルする tsc (TypeScript コンパイラ) コマンドラインに追加できる新しい --incremental フラグが追加されました。 TypeScript は、コードベース内のローカル キャッシュ ディレクトリに最後のコンパイル以降のプロジェクトに関する情報を保存することでこれを実現します。 React コードベースでは、ビルド パイプラインで増分コンパイルを活用するために、必ず Webpack または Parcel を正しく構成してください。 以上が、TypeScript の 7 つの便利な新機能の詳細です。TypeScript の新機能の詳細については、123WORDPRESS.COM の他の関連記事もご覧ください。 以下もご興味があるかもしれません:
|
>>: Nginx ログのカスタマイズとログ バッファの有効化の詳細な説明
以前は、Web ページのプリンタ対応バージョンを作成するには、印刷したときに見栄えがよくなるようにレ...
yum か rpm か? yum によるインストール方法は非常に便利ですが、公式サイトから MySQ...
この記事では、jsで簡単な計算機を作成する具体的なコードを参考までに共有します。具体的な内容は次のと...
Linux でのルーティング設定コマンド1. ホストルーティングを追加する ルートを追加 -host...
今回は、Google Chrome のタブバーのような、特殊な丸い角を持つナビゲーション バーのレイ...
目次Vue での this.$set の使用使用なぜレスポンシブなのか?分析する要約するVue での...
要件は、製品の評価データを渡すことであり、ページには対応する星の数が表示されます。 1. 異なる評価...
** Linuxにmysql-8.0.20をインストールする**環境の紹介オペレーティングシステム:...
目次序文1. ルーティングの遅延読み込み1. ルートの遅延読み込みが必要なのはなぜですか? 2. ル...
1. ディスプレイボックス;要素にこのプロパティを設定すると、display:inline-bloc...
Docker を使用して Angular プロジェクトをデプロイする方法は 2 つあります。1 つは...
プロジェクトシナリオプロジェクトの背景全体にカスタム透かしを追加します。透かしのテキスト、フォントの...
Ubuntu で nvidia グラフィック カード ドライバーをインストールします。同じ方法で ...
目次1. MHAの紹介1. MHAとは何ですか? 2. MHAの構成3. MHAの特徴2. MySQ...
a タグが新しいページを開くかどうか: (1)百度百科事典:ヘッダーが異なる場合は新しいページが開き...