TypeScript 型システム実践:基礎から高度なユーティリティ型まで
前端工程(更新: 2026年5月24日)
なぜツールサイトに TypeScript が必要か?
ToolsKu には 200 以上のツールページ、4 言語の i18n、複雑なツールクライアント設定があります。純粋な JavaScript では以下の場面でエラーが起きやすくなります:
- ツール設定オブジェクトのフィールド名の typo
- 存在しない i18n key がエラーにならない
- API レスポンス構造が期待と一致しない
- リファクタリング時に参照の更新漏れ
TypeScript はこれらのエラーをコンパイル時に検出し、実行時ではありません。
基本的な型テクニック
1. 型推論 vs 明示的な注釈
// ✅ TS に推論させる(簡潔)
const tools = [{ href: '/pdf/merge', name: 'PDF合并' }] as const;
// ✅ 制約が必要な場合は明示的に注釈
function getTool(href: string): ToolItem | undefined {
return ALL_TOOLS.find(t => t.href === href);
}
2. ジェネリック制約
function encode<T extends string | ArrayBuffer>(
input: T
): T extends string ? string : ArrayBuffer {
// 入力型に応じて異なる結果を返す
}
3. ユニオン型と型ガード
type ProcessResult =
| { status: 'success'; data: Blob }
| { status: 'error'; message: string };
function handleResult(result: ProcessResult) {
if (result.status === 'success') {
downloadBlob(result.data); // TS は data の存在を認識
}
}
高度なユーティリティ型
Partial、Required、Pick、Omit
type ToolConfig = {
href: string;
name: string;
blurb: string;
i18nKey?: string;
};
type ToolUpdate = Partial<ToolConfig>; // すべてのフィールドがオプション
type ToolRequired = Required<ToolConfig>; // すべてのフィールドが必須
type ToolPreview = Pick<ToolConfig, 'name' | 'blurb'>; // 一部のみ取得
条件型
type IsString<T> = T extends string ? true : false;
type A = IsString<'hello'>; // true
type B = IsString<42>; // false
マップ型
type Readonly<T> = { readonly [K in keyof T]: T[K] };
type Nullable<T> = { [K in keyof T]: T[K] | null };
JSON → TypeScript 生成
ToolsKu の JSON から TypeScript ツールの実装ロジック:
function jsonToTypeScript(json: unknown, name = 'Root'): string {
if (Array.isArray(json)) {
return `${name}[]`;
}
if (typeof json === 'object' && json !== null) {
const fields = Object.entries(json).map(([key, value]) => {
const type = jsonToTypeScript(value, capitalize(key));
return ` ${key}: ${type};`;
});
return `interface ${name} {\n${fields.join('\n')}\n}`;
}
return typeof json; // string | number | boolean
}
API レスポンス JSON を入力するだけで TypeScript interface をワンクリック生成——手動での型定義の手間を削減します。
実用的なパターン
satisfies 演算子(TS 4.9+)
const config = {
locales: ['zh-CN', 'en'],
defaultLocale: 'zh-CN',
} satisfies RoutingConfig; // リテラル型を保持しつつ構造を検証
const 型パラメータ(TS 5.0+)
function createTool<const T extends string>(href: T) {
return { href } as const;
}
const tool = createTool('/pdf/merge'); // href の型は string ではなく '/pdf/merge'
まとめ
TypeScript の型システムは単なる「型注釈の追加」ではなく、コンパイル時プログラミング言語です。ジェネリック、条件型、ユーティリティ型をマスターすることで、自己文書化されリファクタリングに安全なコードベースを構築できます。ToolsKu の JSON から TypeScript ツールは、型駆動開発の実用的な出発点です。
ブラウザローカルツールを無料で試す →
#TypeScript#类型系统#泛型#工具类型#工程化