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を使うことなく高めることができる