TypeScript インターフェース定義ケースチュートリアル

TypeScript インターフェース定義ケースチュートリアル

インターフェースの役割:

インターフェース (英語: interface) の機能は、簡単に言えば、コードの規則を提供することです。

Typescript では次のように記述されます。

  • TypeScript のコア原則の 1 つは、値が持つ構造を型チェックすることです。これは「ダックタイピング」または「構造的サブタイピング」と呼ばれることもあります。
  • TypeScript では、インターフェースを使用してこれらの型に名前を付け、コードまたはサードパーティ コードのコントラクトを定義します。

例えば:

//インターフェースPersonを定義する
インターフェース Person {
    名前: 文字列;
    年齢: 番号;
}

// 定義された変数 man の型を Person "型" として指定します [この表現は正確ではありませんが、理解を容易にするためです]
let man: 人;

// この時点で、man に値を割り当てる場合、man は定義した Person 制約に準拠している必要があります。つまり、数値型の age フィールドと文字列型の名前フィールドが存在する必要があります。man = { age: 10, name: 'syw' }
# または、次のようにします function fun(women:Person){} // パラメータ women も Person 制約に準拠する必要があります

上記の例では、インターフェースとその機能を定義する方法について簡単に説明しました。ここでは、インターフェースを操作する他の方法について簡単に説明します。

インターフェイスのオプション プロパティを設定します。

オプション属性を持つインターフェースは、オプション属性名の定義の後に ? 記号が追加されることを除いて、通常のインターフェース定義と似ています。

インターフェース Person {
    名前: 文字列
    年齢?: 番号
}

オプション属性の最も一般的な使用法は、このパラメータが渡されるか存在するかが不明な場合です。

オプション パラメータの利点は、Typescript では次のように説明されています。

  • オプション属性の利点の 1 つは、存在する可能性のある属性を事前に定義できることです。もう 1 つの利点は、存在しない属性を参照するときにエラーを検出できることです。

追加のプロパティ チェック:

これについて言えば、簡単にまとめると、属性をオプションとして設定することはできますが、間違った属性を渡すことはできません。

  • 上記の Person インターフェイスを例にとると、使用時に age 属性を誤って aag と記述すると、age 属性自体は渡す必要がないにもかかわらず、TypeScript はエラーを報告します。

これは追加のプロパティ チェックです。

もちろん、型アサーションを使用してこれらのプロパティチェックを回避することもできます。リンクを参照してください: TypeScript の型アサーション [as 構文 | <> 構文]

インターフェイスの読み取り専用属性を設定します。

一部のオブジェクト プロパティは、オブジェクトが最初に作成されたときにのみ変更できます。 したがって、属性名の前に readonly を使用して、読み取り専用属性を指定できます。

インターフェース Person {
    読み取り専用の名前: 文字列;
    読み取り専用 age: 数値;
}
// 初期値を割り当てる let man: Person = {name: 'syw', age: 10};

// この時点で値を変更するとエラーが発生します。
man.age = 20; // エラー!
// 'age' は読み取り専用プロパティであるため、割り当てることはできません。

実際、読み取り専用属性を使用した場合の効果は const と似ています。もちろん、この 2 つはまったく同じものではありません。これは単に理解しやすいように言っているだけです。

Typescript では、readonly と const は次のように記述されます。
  • readonly と const のどちらを使用するかを判断する最も簡単な方法は、それを変数として使用するか、属性として使用するかを確認することです。 変数として使用する場合は const を使用し、プロパティとして使用する場合は readonly を使用します。

関数型インターフェース:

簡単に言えば、関数型のインターフェースは、関数のパラメータ型と関数の戻り値型を指定します。

インターフェース PersonFun {
    (名前: 文字列、年齢: 数値): ブール値
}
// PersonFun制約に従う関数を定義する let manFun: PersonFun = (name: string, age: number) => {
    年齢 > 10 を返します。
}

知らせ:

  1. 関数のパラメータの型は変更できず、戻り値も制約に準拠する必要があります。
  2. 関数パラメータ名は、対応するパラメータ位置の型に互換性がある限り、インターフェース内の名前と対応している必要はありません。
// これも要件を満たしています let manFun: PersonFun = (name12: string, age12: number) => {
    年齢 > 10 を返します。
}

インデックス可能な型インターフェース:

簡単に言えば、インデックス可能な型インターフェースとは、インデックスの型と戻り値の型を指定できることを意味します。

  • 例えば、配列では、インデックスは数値型の値、インデックスは文字列型の値と指定できます。このように、配列の形式は基本的に固定されています。
インターフェース PersonArr {
    [インデックス: 数値]: 文字列
}
// 配列を定義します。let manArr: PersonArr = ['syw','syw1','syw2'];
// manArr[0]をクエリします。 // このとき、0は数値型のインデックスであり、0番目の要素は文字列型のsywを返します。

Typescript は、実際にはインデックス型である数値と文字列の 2 種類のインデックス署名をサポートしています。

また、数値型インデックスを使用する場合、定義される戻り値の型は、文字列型インデックスに対して定義された戻り値のサブタイプである必要があります。

Typescript ではこの文を次のように説明しています:

  • 数値をインデックスに使用すると、JavaScript はそれを文字列に変換し、それを使用してオブジェクトのインデックスを作成します。つまり、100 (数値) によるインデックス付けは、"100" (文字列) によるインデックス付けと同じなので、この 2 つは一貫している必要があります。

初めてこの文を見たとき、意味は理解できましたが、それをどうシンプルに表現したらいいのか分かりませんでした。よく調べてみると、それは私がまだこの文に馴染みがないからかもしれないと分かりました。実はとてもシンプルです。

// たとえば、私の PersonArr には 2 つのインデックスがあり、1 つはインデックス (数値) 型で、もう 1 つはアイテム (文字列) 型です。これら 2 つのインデックスの戻り値を定義するときは、上記の内容に厳密に従う必要があります。
// 数値型インデックスを使用する場合、戻り値の型は文字列型インデックスの戻り値のサブタイプである必要があります。

// 以下に定義するインターフェースはエラーを報告します interface PersonArr {
    [インデックス: 数値]: 文字列;
    [項目: 文字列]: 数値;
}
// インデックスの戻り値は文字列型なので、明らかに数値型の項目の戻り値のサブタイプではありません。// 正しく記述するにはどうすればよいでしょうか?最も簡単な方法は、インデックスの戻り値の型を数値に変更することです。

TypeScript インターフェース定義ケースチュートリアルに関するこの記事はこれで終わりです。TypeScript インターフェース定義に関するその他の関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • TypeScript のジェネリック使用法とジェネリックインターフェースの組み合わせ
  • TypeScript インターフェースの紹介
  • TypescriptとAxiosに基づくインターフェースリクエスト管理の詳細な説明
  • TypeScript 入門 - インターフェース
  • TypeScriptのインターフェースの詳細な説明
  • TypeScript コア基盤インターフェース

<<:  Linux環境でタイムゾーンを設定できない問題を解決

>>:  CentOS に Redis と MySQL をインストールする

推薦する

Dockerコンテナでルート権限を取得する方法

まず、コンテナが稼働している必要がありますコンテナのCONTAINER IDは、sudo docke...

MySQLクエリステートメント内のユーザー変数のコード分析

前回の記事では、MySQL 最適化の概要 - クエリの合計数を紹介しました。この記事では、クエリ ス...

JSX を使用してマークアップ コンポーネント スタイルの開発を作成する例 (フロントエンドのコンポーネント化)

目次JSX環境の構築NPMを初期化するwebpackをインストールするBabelをインストールするw...

HTML+CSSを使用してTG-visionホームページを作成する方法

今回はHTML+CSSレイアウトを使用して、TG-vision Shuanghui Mediaのホー...

Firefox で Webdings フォントをサポートする方法

Firefox、Opera、その他のブラウザは Webdings フォントをサポートしていません。回...

nginxで複数のサーバーを簡単に構成する方法

1: nginx のインストール方法については詳しく説明しません。Baidu で検索してください。 ...

MySql でデータの重複挿入を回避する 3 つの方法

序文MySql で主キーの競合または一意キーの競合が発生した場合、挿入方法に応じてエラーを回避するた...

Tomcat プロジェクトを展開する一般的な方法のいくつか [テスト済み]

1 / Webプロジェクトファイルをwebappsディレクトリに直接コピーするこれは最も一般的に使...

Springboot プロジェクトに動的にパラメータを渡すための Docker の実装方法

背景最近、Docker 初心者の友人から、毎回プロジェクト構成ファイルにハードコーディングしてサービ...

異なるドメイン名への PC または携帯電話のアクセスを区別するように Nginx を構成する方法

新しい公式サイトはオンラインですが、携帯電話で新しい公式サイトにアクセスすると、エクスペリエンスが非...

ECMAScript のイテレータの詳細な説明

目次序文以前のバージョンイテレータパターンイテレータファクトリ関数イテレータプロトコル最後に序文多く...

MySQLカスタム関数の原理と使用法の分析

この記事では、例を使用して MySQL カスタム関数の原理と使用方法を説明します。ご参考までに、詳細...

docker tagとdocker pushの使い方の詳しい説明

Dockerタグの詳しい説明docker tag コマンドの使い方と、ローカルイメージを daocl...

Vue コード強調プラグインの総合的な比較と評価

目次総合的な比較アクティブの観点から機能的な観点から詳細な比較1. エース2. コードミラー3. モ...

SQLクエリの実行順序をゼロから学ぶ

SQL クエリ ステートメントの実行順序は次のとおりです。 (7)選択 (8) DISTINCT &...