functional-ts-ja
サーバーサイドTypeScriptでドメインモデル、ユースケース、リポジトリ、状態遷移、ビジネスロジックを書くときに使用する。Discriminated Union、純粋関数、Result型による関数型ドメインモデリングをガイドする。
What it does
Functional Domain Modeling in TypeScript
サーバーサイドTypeScriptでドメインモデルを書くときの原則。classベースのOOPではなく、TypeScriptの型システムを最大限に活用した関数型アプローチを採る。
1. 型によるドメインモデリング
Discriminated Unionで状態を表現し、kind をdiscriminantとして統一する。type(interface ではなく)、Companion Object、Branded Types、Readonly<>、関数プロパティ記法、1概念1ファイル構成を使う。
バリデーションライブラリの検出: プロジェクトの package.json の dependencies / devDependencies を確認:
zod→ validation-libraries/zod.mdvalibot→ validation-libraries/valibot.mdarktype→ validation-libraries/arktype.md
2. 関数による状態遷移
純粋関数で状態遷移を表現する。関数の引数型が有効な遷移元を制約し、戻り値型が遷移先を明示する。無効な遷移はコンパイルエラーになる。assertNever で網羅性をチェックする。
3. エラーハンドリング — Railway Oriented Programming
例外をスローせず、Result型でエラーを値として扱う。エラー型はDiscriminated Unionで定義し、呼び出し元が網羅的にハンドルできるようにする。
ライブラリの検出: プロジェクトの package.json の dependencies / devDependencies を確認:
neverthrow→ result-libraries/neverthrow.mdbyethrow→ result-libraries/byethrow.mdfp-ts→ result-libraries/fp-ts.mdoption-t→ result-libraries/option-t.md
4. 境界の防御
外部入力(APIリクエスト、DB結果、ファイル読み込み)はバリデーションライブラリのスキーマでランタイムバリデーションする。ドメイン層内部では型を信頼する。型アサーション(as)は使わない。PIIフィールドには Sensitive<T> ラッパーを適用する。
5. 宣言的なスタイル
配列の変換は filter / map / reduce でCompanion Objectの述語関数を使って宣言的に書く。ドメインイベントは不変レコードとしてモデリングする。
6. テストデータ
テストデータは as const satisfies Type で定義し、discriminantのリテラル型を保持しwideningを防ぐ。
詳細: test-data.md
原則の適用について
これらは推奨であり厳格なルールではない。コンテキストに応じて判断してよいが、原則から逸脱する場合はその理由をコメントで明示すること。
典型的な逸脱の正当理由:
- 外部ライブラリがclass継承を要求する場合
- パフォーマンス要件により不変データの生成コストが問題になる場合
- チームの合意により異なるパターンが採用されている場合
Capabilities
Install
Quality
deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 17 github stars · SKILL.md body (2,069 chars)