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) で中国語の文字化けが発生する問題の究極の解決策

推薦する

Baidu 入力メソッドが API を公開、自由に移植して使用できると主張

百度入力方式の担当者は、百度入力方式のオープンAPIの最大の利点は操作が便利であることであり、プラッ...

MySQLはテーブル内のフィールドを別のテーブル内のフィールドの値と等しくなるように更新します

以下のように表示されます。 table1 を z として更新し、table2 を zb として結合し...

CSS3はウェブサイトの製品表示効果図を実現します

この記事では、CSS3 を使用した Web サイトの商品表示の効果を紹介し、皆さんと共有します。詳細...

VMware Workstation 14 Pro は CentOS 7.0 をインストールします

VMware Workstation 14 ProにCentOS 7.0をインストールする具体的な方...

ゲーム開発におけるサウンド処理にCocosCreatorを使用する方法

目次1. Cocos Creatorでのオーディオ再生の基本1. 基本2. 一般的な方法2. Coc...

Nginx ログのカスタマイズとログ バッファの有効化の詳細な説明

序文ウェブサイトのアクセス元をカウントしたい場合は、PHP を使用して情報を取得してデータベースに記...

テンプレートタグの使用方法の詳細な説明(Vue での使用方法の概要を含む)

目次1. HTML5のテンプレートタグ2. テンプレートタグ操作のプロパティとメソッド3. Vueの...

フロントエンドAIカットのコツ(体験談)

AI 画像の切り取りは PS と連携する必要があります。まず、スライスするレイヤーを選択し、それを...

Windows Server2014 にセキュリティを適用して MySQL をインストールする際のエラーに対する完璧な解決策

理由はインストール後にきちんとアンインストールされなかったためです。この問題を解決するには、次の点に...

CSSを使用して、頻繁に表示される奇妙なボタンを簡単に実装します。

背景グループでは、CSS を使用してインセット コーナー ボタンを実装する方法や、矢印付きのボタンを...

Vueコンポーネントの7つの通信方法についての深い理解

目次1. props/$emit導入コードサンプル2.Vスロット導入コードサンプル3.$refs/ ...

Tomcat を設定して IntelliJ IDEA 2018 で最初の Java Web プロジェクトを実行する方法

1 Tomcatをダウンロードして起動する公式サイト http://tomcat.apache.or...

Dockerを使用してSpringBootプロジェクトをデプロイする方法

Docker テクノロジの開発により、マイクロサービスの実装にさらに便利な環境が提供されます。Doc...

IE8は優れたエクスペリエンスを提供します: アクティビティ

今日は IE8 ベータ 1 (以下、IE8 と略します) をチラ見しました。IE8 は素晴らしい体験...

Vue ページに img 画像を導入する方法

HTMLを学ぶとき、画像タグ<img>は画像を導入します <img src=&qu...