TypeScriptにおけるunknownとanyの違いについて詳しく説明します

TypeScriptにおけるunknownとanyの違いについて詳しく説明します

序文

any 型の変数には任意の値を割り当てることができることがわかっています。

myVar: any = 0 とします。
私の変数 = '1';
変数 = false;

TypeScript ガイドラインでは、 any を使用すると型の制約が失われるため、 any の使用は推奨されていません。型制約の必要性は TypeScript を選択した理由の 1 つなので、これは少し矛盾しています。

TypeScript (バージョン 3.0 以降) では、any に似た unknown と呼ばれる特殊な型も提供されます。 未知の型の変数に任意の値を割り当てることもできます。

myVar: 不明 = 0 とします。
私の変数 = '1';
変数 = false;

ここで疑問が生じます。any と unknown の違いは何でしょうか?

1. 不明 vs 任意

unknown と any の違いをよりよく理解するために、まず、唯一の引数で呼び出す関数を記述してみましょう。

invokeAnything() の唯一のパラメータを any 型に設定します。

関数invokeAnything(コールバック: any) {
  折り返し電話();
}

invokeAnything(1); // "TypeError: コールバックは関数ではありません" をスローします

コールバック パラメータは任意の型にすることができるため、ステートメント callback() は TypeError をトリガーしません。 any 型の変数を使えば何でもできます。

しかし、実行すると実行時エラーが発生します: TypeError: callback is not a function. 1 は数値なので、関数として呼び出すことはできません。TypeScript はこのエラーからコードを保護しません。

では、invokeAnything() 関数が任意のタイプのパラメータを受け入れられるようにしながら、パラメータの型チェックを強制して上記のエラーを防ぐにはどうすればよいでしょうか?

未知の兄弟を招待して状況をコントロールしてください。

any と同様に、unknown 変数は任意の値を受け入れます。ただし、TypeScript では、不明な変数を使用しようとすると型チェックが強制されます。これが私たちが望んでいることではないでしょうか?

関数invokeAnything(コールバック: 不明) {
  折り返し電話();
  // オブジェクトは 'unknown' 型です
}

何でも呼び出します(1);

コールバック パラメータの型が不明であるため、ステートメント callback() に型エラーが発生します: オブジェクトの型は 'unknown' です。 いずれの場合も、TypeScript は関数ではない可能性のあるものを呼び出すことから私たちを保護します。

不明な型の変数を使用する前に、型チェックを実行する必要があります。この場合、コールバックが関数型であるかどうかを確認するだけです。

関数invokeAnything(コールバック: 不明) {
  if (typeof コールバック === 'function') {
    折り返し電話();
  }
}

何でも呼び出します(1);

2. 未知とあらゆるもののメンタルモデル

正直に言うと、勉強していたときは、分からないことを理解するのに苦労しました。どちらの型も任意の値を受け入れるのに、any とどう違うのでしょうか? 両者の違いを理解するのに役立ったルールは次のとおりです。

  • 不明な型には何でも割り当てることができますが、型チェックまたは型アサーションを実行する前に不明な型を操作することはできません。
  • 任意の型に任意のものを割り当てることができ、任意の型に対して任意の操作を実行できます。

上記の例は、unknown と any の類似点と相違点を示しています。

不明 例:

関数invokeAnything(コールバック: 不明) {
  // `unknown` 型には何でも代入できます。
  // ただし、型チェックや型アサーションを行う前に `unknown` を操作することはできません if (typeof callback === 'function') {
    折り返し電話();
  }
}

invokeAnything(1); // `unknown` 型には何でも代入できる

型チェック typeof callback === 'function' は、コールバックが関数であるかどうかをチェックします。関数である場合は、呼び出すことができます。

例:

関数invokeAnything(コールバック: any) {
  // `any` 型 callback() に対して任意の操作を実行できます。
}

invokeAnything(1); // `any` 型には何でも代入できる

callback が any の場合、TypeScript は callback() ステートメントに対して型チェックを強制しません。

3. まとめ

Unknown と any は、任意の値を保持できる 2 つの特殊な型です。

型の安全性を高めるため、any ではなく unknown を使用することをお勧めします。unknown を操作する場合は、型アサーションを使用するか、特定の型に絞り込む必要があります。

~~ 終わり。私は小志です。私の彼女は教育・研修業界で働いています。最近彼女の給料が少し低いので、もっと働いてもっとお金を稼ぐつもりです。

編集中にどのようなバグが存在するかはリアルタイムで知る方法がありません。後からこれらのバグを解決するために、ログのデバッグに多くの時間を費やしました。ちなみに、便利なBUG監視ツールFundebugをお勧めしたいと思います。

原文: dmitripvlutin.com/typescript-…

要約する

TypeScript における unknown と any の違いについての記事はこれで終わりです。TypeScript における unknown と any の違いについてさらに詳しく知りたい方は、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

<<:  IEではボタンが両側に伸びる

>>:  Tomcat の静的ページ (html) で中国語の文字化けが発生する問題の究極の解決策

推薦する

MySQL 8.0.20でNavicatをインストールして接続する方法と注意すべき点

注意事項1. まず、mysql インストール ディレクトリに次の内容の my.ini ファイルを作成...

MySQL可視化ツールNavicatへの接続方法

Navicatをインストールした後次のエラーが発生する場合があります: Client does no...

ノードを使用して静的ファイルキャッシュを実装する方法

目次キャッシュキャッシュ位置の分類キャッシュ設定ヘッダーNodeは静的ファイルキャッシュを実装する強...

Vueは適切なスライドアウトレイヤーアニメーションを実装します

この記事では、適切なスライドアウトレイヤーアニメーションを実装するためのVueの具体的なコードを例と...

nginx+lua を使用した単一マシンでの何万もの同時接続の実装

nginx は弊社で最もよく使用されるサーバーで、コンテンツ配信やリバース プロキシによく使用されま...

protobuf の簡単な紹介と Ubuntu 16.04 環境でのインストールチュートリアル

protobufの簡単な紹介Protobuf は、Google のオープンソースのシリアル化プロトコ...

8桁の割引コードをランダムに生成し、MySQLデータベースに保存します。

現在、多くの企業が割引コードを通じてプロモーションを行っています。今では、8桁の割引コードを実装して...

CSS3 は 3D キューブの読み込み効果を作成します

簡単な説明これは CSS3 のクールな 3D キューブのプリロード効果です。この特殊効果は、シンプル...

DQL コマンドを使用して MySQL でデータをクエリする方法

この記事では、MySQL でよく使用されるデータ クエリ言語について説明します。 DQL (データク...

MySQL slow_log テーブルを InnoDB エンジンに変更することはできません。詳細な説明

背景mysql.slow_log からスロー クエリ ログを取得するのは遅く、テーブルは csv テ...

MySQL GTID マスターとスレーブの不一致を修復するソリューション

目次解決策1: レプリカを再構築する前提条件アドバンテージ欠点手順マスター奴隷解決策2: データ修復...

js を使用して QR コードを生成するサンプル コード

以前、プロジェクトでQRコードをスキャンして情報を表示する機能を開発する必要がありました。インターネ...

Ubuntu 18.04で国内ソースを変更する方法の例

Ubuntu はソースが中国からなのでダウンロード速度が比較的遅いです。CentOS と異なり、yu...

チェックボックスの選択またはキャンセルを実装するJavaScript

この記事では、すべてのチェックボックスを選択または解除するためのJavaScriptの具体的なコード...

Zabbixを介してデータベース接続情報といくつかの拡張機能をすばやく取得します

背景アプリケーション システムの数が増え続けると、当初はアラームを発していなかったアクティブ スレッ...