ホームページ ウェブフロントエンド jsチュートリアル TypeScript は厳密に型指定されています - 部分的に完全な静的型

TypeScript は厳密に型指定されています - 部分的に完全な静的型

Aug 01, 2024 am 01:51 AM

TypeScript strictly typed - Part full static types

この投稿シリーズの前の部分では、安全な null 可能性について説明しました。

ここで、TypeScript のデフォルト動作の 3 番目と最後の問題、動的型付けの残存 を説明し、解決します。

以下について説明します:

  • 動的型付けの残骸
  • 実際の等価性チェック
  • 条件内で暗黙的な変換はありません
  • 条件の省略表記
  • 文字列と数字を混ぜることはできません

動的型付けの名残

TypeScript は、入力が非常に動的である JavaScript とは対照的に、「静的な型チェッカー」であると考えられています。

ただし、この投稿シリーズの前の部分では、TypeScript が JavaScript のスーパーセットとして構築されていることも説明しました。

問題は、JavaScript 動的型付けシステムの一部が TypeScript に残っているということです。したがって、これらの残りの動作を抑制して完全な静的型付けを実現する方法について説明します。

実際の等価性チェック

  • ESLint: eqeqeq
  • バイオーム:疑わしい.noDoubleEquals (推奨)

問題の最良の例は、等価性チェックです。 JavaScript では、== は正確には等価性チェック ではなく、等価性チェックです:

1 == "1"; // true
ログイン後にコピー

型が異なっていても、JavaScript が値を比較できるように、いくつかの変換ルールが機能します。ルールの詳細は覚えるのが難しく、非常に奇妙な場合があり、すべての動的言語 (たとえば PHP など) でまったく同じではないため、多くのエラーが発生する可能性があります。

これらの等価性チェックは、JavaScript のような動的に型付けされた言語でのみ意味を持ちます。 TypeScript で作業すると決めた瞬間から、実際の等価性チェック (型と値) のみを使用する必要があります。

1 === "1"; // false
ログイン後にコピー

eqeqeq lint ルールによりこれが強制されます。

Java、C#、Rust などの言語を使用している人は、この問題に特に注意する必要があります。JavaScript や TypeScript の == は、これらの言語の == と同じ意味を持ちません。 JavaScript と TypeScript では、同じ動作を実現するには 3 番目の = が必要です。

条件内の暗黙的な変換はありません

  • ESLint: @typescript-eslint/strict-boolean-expressions
  • バイオーム: ルールがありません

今の状況は安全だと思いますか?残念ながら、変換は暗黙的に行われる可能性があるため、そうではありません:

let tax: number | undefined = 0;

if (tax) {
  console.log("Process payment");
}
if (!tax) {
  throw new Error();
}
ログイン後にコピー

上記の例は次と同等です:

let tax: number | undefined = 0;

if (tax == true) {
  console.log("Process payment");
}
if (tax == false) {
  throw new Error();
}
ログイン後にコピー

ご覧のとおり、暗黙的な == があったため、変換は依然として発生します。0 は true と同等ではなく、false と同等です。したがって、税金が有効な値であるにもかかわらず、エラーが発生します。

strict-boolean-expressions lint ルールは、このような暗黙の条件を禁止し、実際のチェックを強制します。

let tax: number | undefined = 0;

if (tax !== undefined) {
  console.log("Process payment");
}
if (tax === undefined) {
  throw new Error();
}
ログイン後にコピー

JavaScript でのクイック条件に慣れている人にとって、これは従うのが最も面倒なルールの 1 つかもしれませんが、大局的に言えば、これは Java、C#、Rust などの他の言語で物事を行う通常の方法にすぎません。

設定部分で示したように、すべてのエラーを回避するには、allowNumber サブオプションとallowString サブオプションを無効にすることが重要です。

許可される唯一の例外は、オブジェクトと配列です。これらのケースは、文字列や数値とは異なり、偽の値を持たないため安全です。したがって、次のようにしても問題ありません:

let movie: Movie | undefined;
if (movie) {}
if (!movie) {}
ログイン後にコピー

注: switch ステートメントは内部で === を使用しているため、すでに安全です。

条件の省略表記

  • ESLint: @typescript-eslint/prefer-nullish-coalescing (スタイルタイプチェック済み)
  • バイオーム: ルールがありません

strict-boolean-expressions lint ルールは、条件チェックがタイプ セーフであるように注意しますが、if 以外の条件構文もあります。

const movieRating = userRating || 5;

// Which is a shorter version of:
const movieRating = userRating == true ? userRating : 5;
ログイン後にコピー

ユーザーが 0 と評価した場合、0 は false と同等であるため、評価は 0 ではなく 5 になります。

最新の JavaScript を使用すると回避できます:

const movieRating = userRating ?? 5;

// Which is a shorter version of:
const movieRating = userRating !== undefined && userRating !== null
  ? userRating
  : 5;
ログイン後にコピー

これは、prefer-nullish-coalescing lint ルールによって強制できます。

注意してください?? || どこでも使用すべきではありません: ||ブール値を操作する場合にも、これは有効です。

文字列と数字が混在しない

  • ESLint:
    • テンプレートを優先
    • @typescript-eslint/restrict-plus-operands (推奨型チェック済み)
    • @typescript-eslint/restrict-template-expressions (推奨型チェック済み)
  • バイオーム:
    • style.useTemplate (推奨)
    • 他のルールがありません

JavaScript では、+ 演算子は数値の数学的加算と文字列の連結の両方に使用できます。エラーの原因となります。

"There is " + 3 + 1 + "Matrix movies"; // 31
"There is " + (3 + 1) + "Matrix movies"; // 4
ログイン後にコピー

+ 演算子は数学的な加算のために予約されている必要があります。または、少なくとも、restrict-plus-operands lint ルールが強制する同じ型のデータでのみ使用する必要があります。

Template strings from modern JavaScript should be used for string concatenation, which the prefer-template lint rule enforces:

const movie = `Everything everywhere all at once`;
`${movie} is the best movie!`;
ログイン後にコピー

Conversely, only strings should be used in template strings, which the restrict-template-expressions lint rule enforces.

If mixing types is what is actually wanted, conversions should be explicit:

const total = 3;
`There is ${total.toFixed()} Matrix movies`;
ログイン後にコピー

Note that template strings can be nested:

const total = 3;
`There is ${total.toFixed()} Matrix movie${total > 1 ? "s" : ""}`;
ログイン後にコピー

Conclusion

This is the end of this posts series. You can follow my account (button on top right of this page) to know when other posts about TypeScript or other topics like Angular are published.

You want to contact me? Instructions are available in the summary.

以上がTypeScript は厳密に型指定されています - 部分的に完全な静的型の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Python vs. JavaScript:学習曲線と使いやすさ Python vs. JavaScript:学習曲線と使いやすさ Apr 16, 2025 am 12:12 AM

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

C/CからJavaScriptへ:すべてがどのように機能するか C/CからJavaScriptへ:すべてがどのように機能するか Apr 14, 2025 am 12:05 AM

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

JavaScriptとWeb:コア機能とユースケース JavaScriptとWeb:コア機能とユースケース Apr 18, 2025 am 12:19 AM

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

JavaScript in Action:実際の例とプロジェクト JavaScript in Action:実際の例とプロジェクト Apr 19, 2025 am 12:13 AM

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

JavaScriptエンジンの理解:実装の詳細 JavaScriptエンジンの理解:実装の詳細 Apr 17, 2025 am 12:05 AM

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

Python vs. JavaScript:コミュニティ、ライブラリ、リソース Python vs. JavaScript:コミュニティ、ライブラリ、リソース Apr 15, 2025 am 12:16 AM

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

Python vs. JavaScript:開発環境とツール Python vs. JavaScript:開発環境とツール Apr 26, 2025 am 12:09 AM

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

JavaScript通訳者とコンパイラにおけるC/Cの役割 JavaScript通訳者とコンパイラにおけるC/Cの役割 Apr 20, 2025 am 12:01 AM

CとCは、主に通訳者とJITコンパイラを実装するために使用されるJavaScriptエンジンで重要な役割を果たします。 1)cは、JavaScriptソースコードを解析し、抽象的な構文ツリーを生成するために使用されます。 2)Cは、Bytecodeの生成と実行を担当します。 3)Cは、JITコンパイラを実装し、実行時にホットスポットコードを最適化およびコンパイルし、JavaScriptの実行効率を大幅に改善します。

See all articles