Open1
TypeScriptのオーバーロード関数で、ドメインモデルの凝集度を高めるプラクティス
Class絶対使いたくないマンのための、TypeScriptのtypeを用いたモデリングのプラクティス
従来の手法
type User = {
id: string;
name: string;
};
const createUser = (id: string, name: string): User => {
validateId(id)
return {
id,
name
}
}
// Usecase
import {User, createUser} form "@/domain/user"
const UserService = (user: User)=>{
const user = createUser(user.id, user.name)
// etc...
return user
}
Userというモデルに対して、オブジェクトを生成する際に、createUserというコンテキストを知っている必要がある。
また、モデルに対する凝集度が下がっており、Userをimportしたとしても、この型のオブジェクトを作る方法がわからない。
オーバーロード関数による統合
// 型定義 (これはこれまでと変わらず)
type User = {
id: string;
name: string;
};
// 関数のオーバーロードによる型と関数の統合
const User = (id:string, name:string)=>{
validateId(id)
return {
id,
name
}
}
// Usecase
import {User} from "@/domain/user"
const UserService = (user: User)=>{ // User is Type
const user = User(user.id, user.name) // User is functioin
// etc...
return user // User object
}
User をインポートするだけで、Userの型とジェネレート関数を手にいれることができる
User関数の中にドメインのドメインルールを記述することができる
ドメインの凝集度をClassを使うことなく高めることができる