TypeScript 1.6 ユーティリティクラス構造化
TypeScript 1.6 では、ユーティリティクラスを効果的に構造化するためのいくつかの方法があります。ここでは、一般的なアプローチと考慮すべき点を紹介します。
独立した関数群
- 他のモジュールから直接インポートして使用
- 各関数を個別にエクスポート
- シンプルで直接的なアプローチ
// utils.ts
export function isString(value: any): value is string {
return typeof value === 'string';
}
export function capitalize(str: string): string {
return str.charAt(0).toUpperCase() + str.slice(1);
}
静的メソッドを持つクラス
- インスタンス化の必要なし
- クラス名でアクセス
// StringUtils.ts
export class StringUtils {
static isString(value: any): value is string {
return typeof value === 'string';
}
static capitalize(str: string): string {
return str.charAt(0).toUpperCase() + str.slice(1);
}
}
ネストした名前空間
- 名前空間内で関数をグループ化
- 複雑なユーティリティ群を整理
// Utils.ts
namespace Utils {
export namespace String {
export function isString(value: any): value is string {
return typeof value === 'string';
}
export function capitalize(str: string): string {
return str.charAt(0).toUpperCase() + str.slice(1);
}
}
}
考慮すべき点
- 型安全性
TypeScript の型システムを最大限に活用して、バグの早期発見とコードの信頼性を向上させます。 - 命名規則
明確で一貫した命名規則を採用しましょう。 - モジュール性
ユーティリティ関数を適切にモジュール化して再利用性を高めます。 - シンプルさを優先
複雑な構造は避け、読みやすさと使いやすさを重視しましょう。
最適なアプローチの選択
// utils.ts
export function isString(value: any): value is string {
return typeof value === 'string';
}
export function capitalize(str: string): string {
return str.charAt(0).toUpperCase() + str.slice(1);
}
解説
capitalize
関数は、引数の文字列の最初の文字を大文字にして、残りの文字列と連結して返します。isString
関数は、引数の値が文字列かどうかを判定し、真偽値を返します。export
キーワードを使って、これらの関数を他のモジュールからインポートできるようにしています。utils.ts
ファイルに、isString
とcapitalize
という2つの独立した関数を定義しています。
// StringUtils.ts
export class StringUtils {
static isString(value: any): value is string {
return typeof value === 'string';
}
static capitalize(str: string): string {
return str.charAt(0).toUpperCase() + str.slice(1);
}
}
- 静的メソッドはクラスのインスタンスを作成せずに直接呼び出すことができます。
StringUtils
というクラスを定義し、その中にisString
とcapitalize
という2つの静的メソッドを定義しています。
// Utils.ts
namespace Utils {
export namespace String {
export function isString(value: any): value is string {
return typeof value === 'string';
}
export function capitalize(str: string): string {
return str.charAt(0).toUpperCase() + str.slice(1);
}
}
}
- ネストした名前空間を使うと、複雑なユーティリティ群を整理することができます。
Utils
という名前空間を定義し、その中にString
という名前空間をネストしています。
使用例
// 使用する側
import { isString, capitalize } from './utils';
import { StringUtils } from './StringUtils';
import * as Utils from './Utils';
// 独立した関数群
if (isString('hello')) {
console.log(capitalize('hello'));
}
// 静的メソッドを持つクラス
if (StringUtils.isString('world')) {
console.log(StringUtils.capitalize('world'));
}
// ネストした名前空間
if (Utils.String.isString('typescript')) {
console.log(Utils.String.capitalize('typescript'));
}
モジュールシステムを活用した分割
- インポートとエクスポート
必要なモジュールをインポートして使用します。 - 複数のモジュールに分割
ユーティリティ関数を機能別に複数のモジュールに分割します。
// stringUtils.ts
export function isString(value: any): value is string {
return typeof value === 'string';
}
export function capitalize(str: string): string {
return str.charAt(0).toUpperCase() + str.slice(1);
}
// numberUtils.ts
export function isNumber(value: any): value is number {
return typeof value === 'number';
}
// 使用する側
import { isString, capitalize } from './stringUtils';
import { isNumber } from './numberUtils';
インターフェースを利用した型定義
- 型安全なコード
型チェックにより、誤った使い方を防ぎます。 - ユーティリティ関数の型定義
ユーティリティ関数の入力と出力の型をインターフェースで定義します。
interface StringUtils {
isString(value: any): boolean;
capitalize(str: string): string;
}
const stringUtils: StringUtils = {
isString: (value) => typeof value === 'string',
capitalize: (str) => str.charAt(0).toUpperCase() + str.slice(1),
};
ジェネリック型を用いた汎用的なユーティリティ
- 柔軟なユーティリティ関数
ジェネリック型を用いて、さまざまなデータ型に対応するユーティリティ関数を作成します。
function identity<T>(value: T): T {
return value;
}
高階関数によるユーティリティの生成
- カスタマイズ可能なユーティリティ
高階関数を使って、特定の条件や処理をカスタマイズできるユーティリティを生成します。
function createLogger<T>(prefix: string): (value: T) => void {
return (value) => console.log(`${prefix}: ${value}`);
}
const logError = createLogger('Error');
logError('Something went wrong');
適切なアプローチの選択は、プロジェクトの規模、複雑度、チームの好みによって異なります。一般的には、以下の点を考慮しましょう。
- パフォーマンス
性能への影響を考慮し、最適な実装を選択します。 - 可読性
コードをわかりやすく、メンテナンスしやすいように記述します。
typescript typescript1.6