TypeScript マッピング型の詳細

TypeScript マッピング型の詳細

序文:

TypeScriptの公式ドキュメントはかなり前に更新されていますが、私が見つけた中国語のドキュメントはまだ古いバージョンです。そのため、新規および改訂された章の一部が翻訳され、整理されました。

この翻訳は、TypeScript ハンドブックの「マップされた型」の章から編集されています。

この記事は原文通りに厳密に翻訳したものではなく、一部解説や補足も加えています。

1. マップされた型

場合によっては、ある型を別の型に基づいて作成する必要があるものの、コピーを作成したくないことがあります。この場合は、マッピング型の使用を検討できます。

マッピング タイプは、インデックス シグネチャの構文に基づいています。まずはインデックス シグネチャを確認しましょう。

// プロパティの型を事前に宣言する必要がある場合 type OnlyBoolsAndHorses = {
  [キー: 文字列]: ブール値 | 馬;
};
 
const準拠: OnlyBoolsAndHorses = {
  del: 本当、
  ロドニー: 間違いだ、
};


マッピング タイプは、 PropertyKeysユニオン タイプを使用するジェネリック タイプです。PropertyKeys PropertyKeys通常、 keyofを通じて作成され、キー名をループしてタイプを作成します。

タイプ OptionsFlags<Type> = {
  [keyof Type のプロパティ]: boolean;
};


この例では、 OptionsFlags Type のすべてのプロパティを反復処理し、それらをブール型に設定します。

タイプFeatureFlags = {
  ダークモード: () => void;
  新しいユーザープロファイル: () => void;
};
 
タイプ FeatureOptions = OptionsFlags<FeatureFlags>;
// タイプFeatureOptions = {
// darkMode: ブール値;
// 新しいユーザープロファイル: ブール値;
// }


2. マッピング修飾子

マップされた型を使用する場合、使用できる追加の修飾子が 2 つあります。1 つはプロパティを読み取り専用に設定するために使用される readonly で、もう 1 つはプロパティをオプションに設定するために使用される ? です。

これらの修飾子は、プレフィックスに - または + を付けることで削除または追加できます。プレフィックスを指定しない場合は、プレフィックス + を使用するのと同じです。

// 属性内の読み取り専用属性タイプを削除します CreateMutable<Type> = {
  -readonly [keyof Type 内のプロパティ]: Type[プロパティ];
};
 
タイプ LockedAccount = {
  読み取り専用ID: 文字列;
  読み取り専用の名前: 文字列;
};
 
UnlockedAccount を CreateMutable<LockedAccount> と入力します。

// タイプ UnlockedAccount = {
// id: 文字列;
// 名前: 文字列;
// }
// 属性内のオプション属性タイプを削除します。Concrete<Type> = {
  [Typeのキー内のプロパティ]-?: Type[プロパティ];
};
 
MaybeUser = {と入力します
  id: 文字列;
  名前?: 文字列;
  年齢?: 番号;
};
 
User を Concrete<MaybeUser> と入力します。
// タイプ User = {
// id: 文字列;
// 名前: 文字列;
//年齢: 数値;
// }

3. キーの再マッピング

TypeScript 4.1以降では、as ステートメントを使用して、マップされた型のキーを再マップできます。

タイプ MappedTypeWithNewProperties<Type> = {
    [keyof Type の NewKeyType としてのプロパティ]: Type[プロパティ]
}


たとえば、テンプレートリテラル型を使用して、以前のプロパティ名に基づいて新しいプロパティ名を作成できます。

タイプ Getters<Type> = {
    [keyof Type のプロパティは `get${Capitalize<string & Property>}` です]: () => Type[Property]
};
 
インターフェース Person {
    名前: 文字列;
    年齢: 番号;
    場所: 文字列;
}
 
LazyPerson = Getters<Person> と入力します。

// タイプ LazyPerson = {
// getName: () => 文字列;
// getAge: () => 数値;
// getLocation: () => 文字列;
// }

条件型を使用して never を返し、特定の属性を除外することもできます。

// 'kind'プロパティを削除します
タイプ RemoveKindField<Type> = {
    [キーの Type のプロパティが Exclude<Property, "kind"> である]: Type[Property]
};
 
インターフェースサークル{
    種類: "circle";
    半径: 数値;
}
 
タイプ KindlessCircle = RemoveKindField<Circle>;

// タイプ KindlessCircle = {
// 半径: 数値;
// }

また、 string | number | symbolだけでなく、任意のタイプのユニオンを反復処理することもできます。

型 EventConfig<Events extends { kind: string }> = {
    [E in Events を E["kind"]] として: (イベント: E) => void;
}
 
タイプ SquareEvent = { kind: "square", x: 数値, y: 数値 };
タイプ CircleEvent = { kind: "circle", 半径: 数値 };
 
タイプ Config = EventConfig<SquareEvent | CircleEvent>
// タイプ Config = {
// square: (イベント: SquareEvent) => void;
// 円: (イベント: CircleEvent) => void;
// }

4. さらなる調査

マッピング タイプは他の関数でも使用できます。たとえば、これは条件付きタイプを使用し、オブジェクトに pii 属性があるかどうかに応じて true または false を返すマッピング タイプです。

タイプExtractPII<Type> = {
  [keyof Type のプロパティ]: Type[プロパティ] は { pii: true } を拡張します。true : false;
};
 
タイプ DBFields = {
  id: { 形式: "増加中" };
  名前: { タイプ: 文字列; pii: true };
};
 
ObjectsNeedingGDPRDeletion を ExtractPII<DBFields> と入力します。
// type ObjectsNeedingGDPRDeletion = {
// id: false;
// 名前: true;
// }

以下もご興味があるかもしれません:
  • TypeScriptの一般的な型と応用例の説明
  • Typescriptタイプを使用してフィボナッチを計算する方法を教えます
  • TypeScriptの基本型の詳細な説明
  • TypeScript 列挙型
  • TypeScript の基本型の紹介
  • TypeScriptの型を一緒に学びましょう

<<:  CentOS7 環境で gcc (バージョン 10.2.0) をアップグレードする詳細な手順

>>:  さまざまな解像度やブラウザでウェブページを適切に表示する方法

推薦する

MySQL マルチテーブル結合クエリの詳細な説明

目次複数テーブル結合クエリ内部結合左結合右結合サブクエリ要約する複数テーブル結合クエリテーブル間の接...

意外と知らないLinuxのSSHコマンドの使い方7選を徹底解説

システム管理者は複数のサーバーを同時に管理する場合があり、これらのサーバーは異なる場所に配置されてい...

最小限のルートファイルシステムを構築するためにbusyboxを移植するための詳細な手順

Busybox: 小さなコマンドが詰まったスイスアーミーナイフ。ステップ1: ディレクトリ構造を作成...

HTML のボタン タグをクリックしてページにジャンプする 3 つの方法

方法1: onclickイベントを使用する <input type="button&...

Tomcat+Mysql の高同時実行構成の最適化の説明

1.Tomcatの最適化構成(1)Tomcatのcatalina.batを変更するJavaをサーバー...

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

MySQL 8.0のインストールと設定方法は参考までに。具体的な内容は以下のとおりです。ダウンロード...

インタラクティブな視覚化 JS ライブラリ gojs の使い方の紹介とヒント

目次1. gojsの紹介2. Gojsのアプリケーションシナリオ3. gojs を選ぶ理由: 4. ...

優れたWebフォームデザイン事例20選

ソフィー・ハルダッククライドキー埠頭 37 東ソープボックス Rxバランス EEハーバー対比 SVN...

MySQL 5.7.27 のダウンロード、インストール、設定に関する詳細なチュートリアル

目次1. ダウンロード手順2. 環境変数を設定する3. my.iniファイルを設定する4. MySQ...

Linux に JDK1.8 をインストールするための詳細なチュートリアル

1. 設置前の清掃 rpm -qa | grep jdk rpm -qa | grep gcj yu...

vagrant+virtualBoxで仮想マシンを構築する方法

1. はじめにVagrant は、仮想マシン (VirtualBox) を構築および管理するためのツ...

ubuntu14.04 に jdk1.8 をインストールするチュートリアル

1. jdkダウンロードアドレスをダウンロードする我下載的是jdk-8u221-linux-x64....

ubuntu20.04 上の CLion2020.1.3 での ROS のインストールと設定の詳細な説明

1. CLionをダウンロード、インストール、アクティベートするオンラインで提供されるチュートリアル...

Docker コンテナ ソース コードのデプロイ httpd ストレージ ボリュームを使用して Web サイトをデプロイする (推奨)

目次Dockerコンテナのソースコードを使用してhttpdをデプロイし、ストレージボリュームを使用し...

JavaScript で動的な QML オブジェクトを作成する方法

1. オブジェクトを動的に作成するJavaScript からオブジェクトを動的に作成する方法は 2 ...