[TS] Optionalを作成する
公開日
2024年12月20日
更新日
2025年1月5日
4
分で読める
TypeScript
TypeScript を使用してプログラミングを行う際、データ構造を表現するために型を定義する必要がよくあります。例えば、データベースのテーブル構造と一致する Article という型を持っているとします。
export type Article = {
title: string;
content: string;
author: string;
createdAt: Date;
updatedAt: Date;
deletedAt: Date | null;
};
Article を作成する際、一部のフィールド(例えば updatedAt や deletedAt)は必須ではありません。この場合、通常は作成操作専用の型を定義します。
export type ArticleCreateInput = {
title: string;
content: string;
author: string;
createdAt: Date;
updatedAt?: Date;
deletedAt?: Date | null;
};
この方法は問題を解決できますが、コードの冗長性を引き起こします。ArticleCreateInput と Article の定義には多くの重複があり、メンテナンスのコストが増大するだけでなく、コードの読みやすさや修正のしやすさも低下します。
TypeScript の特性を活用してコードを最適化
この問題を解決するために、TypeScript の高度な型機能を活用してコードを簡素化できます。汎用的な Optional 型を定義することで、特定のフィールドを動的にオプショナル(任意)に設定できます。
export type Optional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
Optional 型の原理
Omit<T, K>: 型 T からフィールド K を除外します。Pick<T, K>: 型 T からフィールド K を抽出します。Partial<Pick<T, K>>: 抽出されたフィールド K をオプショナルにします。- 最後に、交差型
&を使用して結果をマージします。
このツール型を使用すれば、ArticleCreateInput 型を簡単に作成でき、重複した定義は不要になります。
export type ArticleCreateInput = Optional<Article, 'updatedAt' | 'deletedAt'>;
最適化のメリット
- コードの冗長性を削減: 型を繰り返し定義する必要がなく、変更が必要なフィールドだけに集中できます。
- メンテナンス性の向上: Article 型が変更された場合、関連する型も自動的に同期されます。
- 可読性の向上: フィールドの違いを明確に表現でき、コードが直感的になります。
まとめ
TypeScript のツール型を使用することで、コードの冗長性を削減し、メンテナンス性を向上させることができます。汎用的な Optional 型を定義することで、特定のフィールドをオプショナルに設定し、ArticleCreateInput のような型を繰り返し定義する必要がなくなります。このテクニックがプロジェクト開発の効率向上に役立つことを願っています!