ホームページ ウェブフロントエンド jsチュートリアル TypeScript ユーティリティの種類: 完全ガイド

TypeScript ユーティリティの種類: 完全ガイド

Dec 08, 2024 am 03:41 AM

TL;DR: TypeScript ユーティリティ タイプは、既存のタイプを変換する事前に構築された関数であり、コードをクリーンにして保守しやすくします。この記事では、ユーザー プロファイルの更新、構成の管理、データの安全なフィルターの方法など、重要なユーティリティの種類について実際の例を示して説明します。

TypeScript Utility Types: A Complete Guide

TypeScript は現代の Web 開発の基礎であり、開発者がより安全で保守しやすいコードを作成できるようにします。 TypeScript は、JavaScript に静的型付けを導入することで、コンパイル時のエラーの検出に役立ちます。 2024 年の Stack Overflow Developer Survey によると、TypeScript は開発者の間で最も人気のあるスクリプト テクノロジの中で 5 にランクされています。

TypeScript の素晴らしい機能が、その成功の主な理由です。たとえば、ユーティリティ型は、開発者が型の操作を簡素化し、定型コードを減らすのに役立ちます。ユーティリティ タイプは TypeScript 2.1 で導入され、新しいリリースごとにユーティリティ タイプが追加されています。

この記事では、TypeScript をマスターするのに役立つユーティリティの種類について詳しく説明します。

TypeScript ユーティリティの種類を理解する

ユーティリティ型は、既存の型を新しいバリアント型に変換できるようにする TypeScript の事前定義されたジェネリック型です。これらは、既存の型をパラメータとして受け取り、特定の変換ルールに基づいて新しい型を返す型レベルの関数と考えることができます。

これは、実際に型定義を複製する必要がなく、すでに存在する型の変更されたバリアントが必要になることが多いインターフェイスを操作する場合に特に便利です。

コア ユーティリティ タイプとその実際のアプリケーション

TypeScript Utility Types: A Complete Guide

部分的

Partial ユーティリティ タイプはタイプを受け取り、そのすべてのプロパティをオプションにします。このユーティリティ型は、プロパティを再帰的にオプションにするため、型がネストされている場合に特に役立ちます。

たとえば、ユーザー プロファイル更新関数を作成しているとします。この場合、ユーザーがすべてのフィールドを更新したくない場合は、部分タイプを使用して、必要なフィールドのみを更新できます。これは、すべてのフィールドが必須ではないフォームや API で非常に便利です。

次のコード例を参照してください。

interface User {
  id: number;
  name: string;
  email?: string;
}

const updateUser = (user: Partial<User>) => {
  console.log(Updating user: ${user.name} );
};

updateUser({ name: 'Alice' });

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

必須

Required ユーティリティ タイプは、提供されたタイプのすべてのプロパティを required に設定してタイプを構築します。これは、オブジェクトをデータベースに保存する前に、すべてのプロパティが利用可能であることを確認するのに役立ちます。

たとえば、必須 を車の登録に使用すると、新しい車のレコードを作成または保存するときに、ブランド、モデル、走行距離などの必要なプロパティを見逃すことがなくなります。これはデータの整合性の観点から非常に重要です。

次のコード例を参照してください。

interface User {
  id: number;
  name: string;
  email?: string;
}

const updateUser = (user: Partial<User>) => {
  console.log(Updating user: ${user.name} );
};

updateUser({ name: 'Alice' });

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

読み取り専用

Readonly ユーティリティ タイプは、すべてのプロパティが読み取り専用であるタイプを作成します。これは、重要な設定を不要な変更から保護する構成管理において非常に役立ちます。

たとえば、アプリが特定の API エンドポイントに依存している場合、それらは実行中に変更されることがあってはなりません。これらを読み取り専用にすると、アプリのライフサイクル全体を通じてそれらが一定のままであることが保証されます。

次のコード例を参照してください。

interface Car {
  make: string;
  model: string;
  mileage?: number;
}

const myCar: Required<Car> = {
  make: 'Ford',
  model: 'Focus',
  mileage: 12000,
};

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

選ぶ

Pick** ユーティリティ タイプは、既存のタイプからプロパティのセットを選択してタイプを構築します。これは、ユーザーの名前や電子メールなどの重要な情報をフィルターで除外して、ダッシュボードまたは概要ビューに表示する必要がある場合に便利です。データのセキュリティと明確性の向上に役立ちます。

次のコード例を参照してください。

interface Config {
  apiEndpoint: string;
}

const config: Readonly<Config> = { apiEndpoint: 'https://api.example.com' };

// config.apiEndpoint = 'https://another-url.com'; // Error: Cannot assign to 'apiEndpoint'

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

省略

Omit ユーティリティ タイプは、既存の型から特定のプロパティを除外して型を構築します。

たとえば、省略 は、電子メール アドレスなどの機密情報を含まないユーザー データを第三者と共有したい場合に便利です。これを行うには、これらのフィールドを除外する新しい型を定義します。特に API では、API 応答の外部に何が送信されるかを監視するとよいでしょう。

次のコード例を参照してください。

interface User {
  id: number;
  name: string;
  email: string;
}

type UserSummary = Pick<User, 'name' | 'email'>;

const userSummary: UserSummary = {
  name: 'Alice',
  email: 'alice@example.com',
};

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

記録

Record ユーティリティ タイプは、指定されたキーと値を持つオブジェクト タイプを作成します。これは、構造化マッピングを扱うときに便利です。

たとえば、在庫管理システムのコンテキストでは、Record タイプは品目と数量の間の明示的なマッピングを作成するのに役立ちます。このタイプの構造を使用すると、予想されるすべての成果が確実に考慮されていると同時に、在庫データに簡単にアクセスして変更できます。

interface User {
  id: number;
  name: string;
  email?: string;
}

const userWithoutEmail: Omit<User, 'email'> = {
  id: 1,
  name: 'Bob',
};

ログイン後にコピー
ログイン後にコピー

除外する

Exclude** ユーティリティ タイプは、共用体から特定の型を除外することによって型を構築します。

特定のプリミティブ型 (文字列ではなく数値やブール値など) のみを受け入れる関数を設計する場合は、Exclude を使用できます。これにより、予期しない型によって実行中にエラーが発生する可能性があるバグを防ぐことができます。

次のコード例を参照してください。

type Fruit = 'apple' | 'banana' | 'orange';
type Inventory = Record<Fruit, number>;

const inventory: Inventory = {
  apple: 10,
  banana: 5,
  orange: 0,
};

ログイン後にコピー
ログイン後にコピー

抽出する

Extract ユーティリティ型は、共用体から特定の型を抽出して型を構築します。

混合型のコレクションから数値のみを処理する必要があるシナリオ (計算の実行など) では、Extract を使用すると、数値のみが確実に渡されます。これは、厳密な型指定により実行時エラーを防ぐことができるデータ処理パイプラインで役立ちます。

次のコード例を参照してください。

interface User {
  id: number;
  name: string;
  email?: string;
}

const updateUser = (user: Partial<User>) => {
  console.log(Updating user: ${user.name} );
};

updateUser({ name: 'Alice' });

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

Null 不可

NonNullable ユーティリティ型は、指定された型から null未定義 を除外して型を構築します。

ユーザー名や製品 ID など、一部の値を常に定義する必要があるアプリでは、値を NonNullable にすると、そのようなキー フィールドが null や 未定義。これは、フォームの検証中や、値の欠落によって問題が発生する可能性がある API からの応答中に役立ちます。

次のコード例を参照してください。


interface Car {
  make: string;
  model: string;
  mileage?: number;
}

const myCar: Required<Car> = {
  make: 'Ford',
  model: 'Focus',
  mileage: 12000,
};

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
戻り値の型

ReturnType ユーティリティは、関数の戻り値の型を抽出します。

座標などの複雑なオブジェクトを返す高階関数またはコールバックを操作する場合、

ReturnType を使用すると、毎回手動で指定する必要がなく、予想される戻り値の型の定義が簡素化されます。これにより、型の不一致に関連するバグが減り、開発がスピードアップします。

interface Config {
  apiEndpoint: string;
}

const config: Readonly<Config> = { apiEndpoint: 'https://api.example.com' };

// config.apiEndpoint = 'https://another-url.com'; // Error: Cannot assign to 'apiEndpoint'

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
パラメータ

パラメータ ユーティリティは、関数のパラメータの型をタプルとして抽出します。

これにより、関数の周囲にラッパーを作成する場合など、関数パラメーターを動的に操作または検証したい場合に、パラメーターの型を簡単に抽出して再利用できます。関数シグネチャの一貫性を確保することで、コードベース全体でのコードの再利用性と保守性が大幅に向上します。

次のコード例を参照してください。


interface User {
  id: number;
  name: string;
  email: string;
}

type UserSummary = Pick<User, 'name' | 'email'>;

const userSummary: UserSummary = {
  name: 'Alice',
  email: 'alice@example.com',
};

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ユーティリティタイプを組み合わせた高度なユースケース

これらのユーティリティ タイプを組み合わせると、TypeScript でアプリを開発するときに強力な結果が得られます。複数のユーティリティ タイプが効果的に連携するいくつかのシナリオを見てみましょう。

部分と必須の組み合わせ

特定のフィールドを必要とする型を作成し、他のフィールドをオプションにすることができます。


interface User {
  id: number;
  name: string;
  email?: string;
}

const userWithoutEmail: Omit<User, 'email'> = {
  id: 1,
  name: 'Bob',
};

ログイン後にコピー
ログイン後にコピー
この例では、

UpdateUser には id プロパティが必要ですが、名前と電子メールはオプションです。このパターンは、識別子が常に存在する必要があるレコードを更新する場合に役立ちます。

柔軟な API レスポンスの作成

特定の条件に基づいてさまざまな形状を持つことができる API 応答を定義することができます。


type Fruit = 'apple' | 'banana' | 'orange';
type Inventory = Record<Fruit, number>;

const inventory: Inventory = {
  apple: 10,
  banana: 5,
  orange: 0,
};

ログイン後にコピー
ログイン後にコピー
ここで、

ApiResponse を使用すると、API 呼び出しに対する柔軟な応答タイプを作成できます。 Pick を使用すると、関連するユーザー データのみが応答に含まれるようになります。

フィルタリングタイプとして除外と抽出を組み合わせる

特定の基準に基づいてユニオンから特定の型をフィルタリングする必要がある状況が発生する場合があります。

次のコード例を参照してください。

interface User {
  id: number;
  name: string;
  email?: string;
}

const updateUser = (user: Partial<User>) => {
  console.log(Updating user: ${user.name} );
};

updateUser({ name: 'Alice' });

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ここでは、Exclude ユーティリティを使用して、元の ResponseTypes 共用体から loading を除外する型 ( NonLoadingResponses ) を作成します。 handleResponse 関数が受け入れのみを許可する有効な入力として 成功 または エラー を入力します。

ベストプラクティス

必要な場合のみ使用する

ユーティリティ型は非常に強力ですが、使いすぎるとコードが複雑で読みにくくなる可能性があります。これらのユーティリティの活用とコードの明瞭性の維持との間でバランスを取ることが重要です。

次のコード例を参照してください。

interface Car {
  make: string;
  model: string;
  mileage?: number;
}

const myCar: Required<Car> = {
  make: 'Ford',
  model: 'Focus',
  mileage: 12000,
};

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

明瞭さを維持する

各ユーティリティのユースケースの目的が明確であることを確認してください。あまりにも多くのユーティリティを一緒にネストしないでください。型の意図した構造が混乱する可能性があります。

次のコード例を参照してください。

interface Config {
  apiEndpoint: string;
}

const config: Readonly<Config> = { apiEndpoint: 'https://api.example.com' };

// config.apiEndpoint = 'https://another-url.com'; // Error: Cannot assign to 'apiEndpoint'

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

パフォーマンスに関する考慮事項

TypeScript 型はコンパイル後に消えるため、実行時にパフォーマンスに影響することはほとんどありませんが、複雑な型は TypeScript コンパイラーの速度を低下させ、開発速度に影響を与える可能性があります。

interface User {
  id: number;
  name: string;
  email: string;
}

type UserSummary = Pick<User, 'name' | 'email'>;

const userSummary: UserSummary = {
  name: 'Alice',
  email: 'alice@example.com',
};

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

結論

TypeScript が Web 開発者の間で最も人気のある言語の 1 つであることは疑いの余地がありません。ユーティリティ タイプは、正しく使用すると TypeScript の開発エクスペリエンスとコードの品質を大幅に向上させる、TypeScript のユニークな機能の 1 つです。ただし、パフォーマンスとコードの保守性の問題が発生する可能性があるため、すべてのシナリオでこれらを使用するべきではありません。

関連ブログ

  • JavaScript および TypeScript のトップ リンター: コード品質管理の簡素化
  • すべての開発者が知っておくべき 7 つの JavaScript 単体テスト フレームワーク
  • TypeScript での感嘆符の使用
  • TypeScript の条件型を理解する

以上が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)

フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? Apr 04, 2025 pm 02:42 PM

フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

javascriptの分解:それが何をするのか、なぜそれが重要なのか javascriptの分解:それが何をするのか、なぜそれが重要なのか Apr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

誰がより多くのPythonまたはJavaScriptを支払われますか? 誰がより多くのPythonまたはJavaScriptを支払われますか? Apr 04, 2025 am 12:09 AM

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? Apr 04, 2025 pm 05:09 PM

同じIDを持つ配列要素をJavaScriptの1つのオブジェクトにマージする方法は?データを処理するとき、私たちはしばしば同じIDを持つ必要性に遭遇します...

JavaScriptは学ぶのが難しいですか? JavaScriptは学ぶのが難しいですか? Apr 03, 2025 am 12:20 AM

JavaScriptを学ぶことは難しくありませんが、挑戦的です。 1)変数、データ型、関数などの基本概念を理解します。2)非同期プログラミングをマスターし、イベントループを通じて実装します。 3)DOM操作を使用し、非同期リクエストを処理することを約束します。 4)一般的な間違いを避け、デバッグテクニックを使用します。 5)パフォーマンスを最適化し、ベストプラクティスに従ってください。

Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は?
または:
Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は? または: Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Apr 04, 2025 pm 05:36 PM

この記事の視差スクロールと要素のアニメーション効果の実現に関する議論では、Shiseidoの公式ウェブサイト(https://www.shisido.co.co.jp/sb/wonderland/)と同様の達成方法について説明します。

Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Apr 04, 2025 pm 05:12 PM

Console.log出力の違いの根本原因に関する詳細な議論。この記事では、Console.log関数の出力結果の違いをコードの一部で分析し、その背後にある理由を説明します。 �...

JavaScriptの進化:現在の傾向と将来の見通し JavaScriptの進化:現在の傾向と将来の見通し Apr 10, 2025 am 09:33 AM

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

See all articles