Guides functional domain modeling in server-side TypeScript using Discriminated Unions for states, pure functions for transitions, Result types for errors, and defensive boundaries for domain models, use cases, repositories, and business logic.
npx claudepluginhub iwasa-kosui/functional-ts-principlesThis skill uses the workspace's default tool permissions.
サーバーサイドTypeScriptでドメインモデルを書くときの原則。classベースのOOPではなく、TypeScriptの型システムを最大限に活用した関数型アプローチを採る。
boundary-defense.mddeclarative-style.mddomain-modeling.mderror-handling.mdexamples/sensitive-type-arktype.tsexamples/sensitive-type-valibot.tsexamples/sensitive-type.tsexamples/taxi-request-arktype.tsexamples/taxi-request-valibot.tsexamples/taxi-request.tsresult-libraries/byethrow.mdresult-libraries/fp-ts.mdresult-libraries/neverthrow.mdresult-libraries/option-t.mdstate-modeling.mdtest-data.mdvalidation-libraries/arktype.mdvalidation-libraries/valibot.mdvalidation-libraries/zod.mdGuides functional domain modeling in server-side TypeScript using discriminated unions, pure functions, Result types for domain models, use cases, repositories, state transitions, business logic.
Provides TypeScript functional patterns for ADTs, discriminated unions, Result/Option types, branded types. Use for state machines, type-safe domain models, and error handling.
Guides idiomatic TypeScript development with strict mode, interfaces vs types, discriminated unions, flat control flow, type guards, and Result patterns. Use for writing TS code, Node.js services, or React apps.
Share bugs, ideas, or general feedback.
サーバーサイドTypeScriptでドメインモデルを書くときの原則。classベースのOOPではなく、TypeScriptの型システムを最大限に活用した関数型アプローチを採る。
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純粋関数で状態遷移を表現する。関数の引数型が有効な遷移元を制約し、戻り値型が遷移先を明示する。無効な遷移はコンパイルエラーになる。assertNever で網羅性をチェックする。
例外をスローせず、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外部入力(APIリクエスト、DB結果、ファイル読み込み)はバリデーションライブラリのスキーマでランタイムバリデーションする。ドメイン層内部では型を信頼する。型アサーション(as)は使わない。PIIフィールドには Sensitive<T> ラッパーを適用する。
配列の変換は filter / map / reduce でCompanion Objectの述語関数を使って宣言的に書く。ドメインイベントは不変レコードとしてモデリングする。
テストデータは as const satisfies Type で定義し、discriminantのリテラル型を保持しwideningを防ぐ。
詳細: test-data.md
これらは推奨であり厳格なルールではない。コンテキストに応じて判断してよいが、原則から逸脱する場合はその理由をコメントで明示すること。
典型的な逸脱の正当理由: