TypeScript 学習ノート: 型の絞り込み

TypeScript 学習ノート: 型の絞り込み

序文

TS の最も優れた点は、強力な型付けとそれに続く型の絞り込みです。ついでにまとめておきます。

型推論

TypeScript では、型推論により明示的な型がない場合に型を提供できます。

例:

let x = [0, 1, null] // 数値

let x = Math.random() < 0.5 ? 100 : "helloword" // 数値|文字列

let x: Animal[] = [new Rhino(), new Elephant(), new Snake()]; // サイ | 象 | ヘビ

最適な共通型が見つからない場合、型推論の結果は共用体配列型になります。

ユニオン型と型ガード

例:

// ユニオン型 type Types = number | string

関数 typeFn(型: Types、入力: 文字列): 文字列 {
  // これを書く場合は、type の型を決定する必要があります}

型推論を直接割り当てることができる

x:数値|文字列 = 1 とします
x="ティエダン"

判断しないとエラーになります。

関数 typeFn(型: 数値 | 文字列、入力: 文字列) {
  // エラー演算子 + は文字列には適用できません 
  新しい配列(type + 1).join("") + 入力を返す
}

だから私たちは判断しなければならない

関数 typeFn(型: 数値 | 文字列、入力: 文字列) {
  // 型ガード if (typeof type === 'number') {
    新しい配列(type + 1).join(" ") + input を返す
  }
  戻り値の型 + 入力
}

型絞り込みとは、判定型に基づいてより具体的な型を再定義することです。

では、なぜこれを学ぶのかという疑問が生じます。js は良いものではないのですか?

個人的な意見:

TypeScript を使用すると、弱い言語としての JavaScript の脆弱性を軽減し、誤った型によって発生するエラーのリスクや、さまざまな JavaScript バージョンの混在によって発生するエラーのリスクを軽減できます。

TypeScript は、高級言語の強力な型付けという最も重要な機能を JavaScript に簡単に導入し、JavaScript コードの記述時にデータ型の変換によって発生する予期しないエラーを防ぎ、トラブルシューティングの難易度を高めるという問題を解決します。

typeof の型ガード:

"弦"
"番号"
"bigint" // ES10 では "boolean" が追加されます
"symbol" // ES6 では "undefined" が追加されます
"物体"
"関数"

注意: typeof nullはobjectと等しい

したがって:

関数 strOrName(str: 文字列 | 文字列[] | null) {
  if (typeof str === 'object') {
    (const s of str) の場合 {
      // str が null の可能性があるためエラーを報告します
      コンソール.log(複数)
    }
  } そうでない場合 (typeof str === 'string') {
    コンソール.log(文字列)
  } それ以外 {
    //.......
  }
}

真理値の絞り込み

js の真理値表は非常に複雑です。以下は偽ですが、それ以外はすべて真です。

0
ナン
「」
0n // 0 の Bigint バージョン null
未定義

nullエラーを回避するには、真理値絞り込みを使用することができます。

// true 値を使用して判断します if (str && typeof strs === 'object') {
  (const s of strs) の場合 {
    コンソール.log(複数)
  }
}

これもOK

関数valOrName(値: number[] | undefined, フィルター: number): number[] | undefined {
  if (!値) {
    戻り値
  } それ以外 {
    戻り値.filter(x => x > filter)
  }
}

要約: 真理値の絞り込みにより、null/undefined/0 などの値の処理が容易になります。

平等の縮小

等価性を絞り込みたい場合は、===、!==、==、and、!= などの演算子を使用して等価性を絞り込むことができます。

例1:

関数 strOrNum(x: 文字列 | 数値, y: 文字列 | ブール値) {
  もし (x === y) {
    // 弦
  } それ以外 {
    // 文字列|数値
  }
}

例2:

関数 strOrName(str: 文字列 | 文字列[] | null) {
  if (str !== null) {
    if (typeof str === 'object') {
      (const s of str) の場合 {
        console.log(s) // []
      }
    } そうでない場合 (typeof str === 'string') {
      console.log(str) // 文字列
    } それ以外 {
      // .....
    }
  }
}

例3:

インターフェース型 {
  値: 数値 | null | 未定義
}

関数 valOrType(type: Types, val: number) {
  // null と undefined はどちらも false であり、数値のみになります
  (type.value != null)の場合{
    タイプ.値 *= val
  }
}

演算子の絞り込み

in はオブジェクトにプロパティがあるかどうかをチェックし、「型ガード」として機能します。

例:

インターフェースA { a: 数値 };
インターフェース B { b: 文字列 };

関数foo(x:A | B) {
    if ("a" in x) {
        xa を返します。
    }
    xb を返します。
}

インスタンスの絞り込み

instanceof 式の右側は、any 型、または Function インターフェース型に割り当て可能な型である必要があります。

例:

関数 dateInval(x: 日付 | 文字列) {
  if (x インスタンスの日付) {
    // 日付
  } それ以外 {
    // 弦
  }
}

狭まりの本質

絞り込みの本質は、型を再定義することである

例:

関数の例() {
  x: 文字列 | 数値 | ブール値
  x = Math.random() < 0.5
  もし(Math.random() < 0.5){
    x = 'hello' // 文字列
  } それ以外 {
    x = 100 // 数値
  }
  return x; // 文字列|数値
}

ユニオン型の縮小

例1:

インターフェースシェイプ{
  種類: "円" | "四角"、
  redius?: 番号
  サイドの長さ?: 数値
}

// エラー関数 getArea(shape: Shape) {
	Math.PI * shape.redius ** 2 を返す
}
// 絞り込みまたはエラー function getArea(shape: Shape) {
  if (shape.kind === '円') {
    Math.PI * shape.redius ** 2 を返す
  }
}
// 非nullアサーション関数を使用する getArea(shape: Shape) {
  if (shape.kind === '円') {
    Math.PI * shape.redius! ** 2 を返す
  }
}

例2:

インターフェースサークル{
  種類: "circle";
  redius: 数値;
}

インターフェーススクエア{
  種類: "正方形";
  redius: 数値;
}

タイプ 形状 = 円 | 四角形

関数 getArea(shape: Shape) {
  if (shape.kind === 'cirle') { // narrow return Math.PI * shape.redius ** 2
  }
}

// または関数 getArea(shape: Shape) {
  スイッチ (形状.種類) {
    ケース「円」:
      Math.PI * shape.redius ** 2 を返す
    ケース「正方形」:
      shape.sideLength ** 2 を返す
    デフォルト:
      const _example: 決して = シェイプ
      戻り値 _example
  }
}

要約する

TypeScript の型絞り込みに関する学習ノートはこれで終了です。TypeScript の型絞り込みに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • TypeScript 型推論
  • TypeScript 基本データ型
  • 知らない TypeScript の高度な型 (まとめ)
  • TypeScript 学習ノート: 基本的な型

<<:  MySQL のマスター スレーブ レプリケーション オプションをオンラインで変更する方法

>>:  Ubuntu 16.04 カーネルのアップグレード手順

推薦する

MySQL インデックス最適化の説明

日常業務では、実行に時間のかかる SQL ステートメントを記録するために、スロー クエリを実行するこ...

React における useEffect と useLayoutEffect の違い

目次前提条件使用効果コミット前ミューテーション効果コミットミューテーション効果コミットレイアウト効果...

Tomcat をアンインストールして再インストールする方法 (画像とテキスト付き)

tomcat9をアンインストールする1. Tomcatのインストールはディレクトリに解凍するだけで...

MySQLテーブルの内容の変更を監視し、MySQL binlogを有効にする

序文binlog は、MySQL のすべての追加、削除、および変更ステートメントを記録するバイナリ ...

aタグ疑似クラスの機能と記述順序は何ですか?

a タグ疑似クラスの役割: 「:link」: 訪問されていないタグの状態。 「:visited」: ...

進捗バーのネイティブ JavaScript 実装

進捗バーを実装するためのJavaScriptの具体的なコードは参考までに。具体的な内容は次のとおりで...

Vue3.0 + TypeScript + Vite初体験の詳しい説明

目次プロジェクトの作成プロジェクト構造メイン.jsアプリ.vue:設定コンポジションAPI参照反応的...

Docker で Redis クラスターを素早く構築する方法の例

Redis クラスターとはRedis クラスターは、R​​edis が提供する分散データベース ソリ...

MySQL での数値のフォーマットの詳細な説明

最近、仕事の都合で、MySQL で数字をフォーマットする必要がありましたが、インターネット上にはほと...

MySQL の group by と having の詳細な説明

GROUP BY 構文を使用すると、指定されたデータ列の各メンバーに従ってクエリ結果をグループ化して...

MySQL 8.0 のデフォルトのデータディレクトリを変更する (設定なしの簡単な操作)

使用シナリオ: Alibaba Cloud を使用しており、データディスクを別途購入しました (大容...

MySQLの不合理なMaxIdleConnsにより接続が短くなる

1 背景最近、Shimo Document のオンライン ビジネスでパフォーマンスの問題が発生しまし...

MacOS での MySQL 8.0.18 のインストールと設定方法のグラフィック チュートリアル

この記事では、MacOSでのMySQL 8.0.18のインストールと成功したコマンドライン操作を記録...

システム CD をマウントして yum ウェアハウスを構築する VMware 15.5 バージョンのグラフィック チュートリアル

1. CentOS 7 仮想マシンを開きます。 2. 仮想マシンにログインし、リストにないユーザー名...

CSS3で実装されたダイナミックな星空の背景

結果:実装コードhtml <link href='https://fonts.goog...