Open4

TypeScriptでのドメインモデリングについて考える

uuyu-guuyu-g

ドメインモデリングをどうコードにしていいかを考える。
主にDDDで言うEntityやValue Objectの表現方法について。

クラスでの表現はツリーシェイキングが効かない、シリアライズに手間がかかるということで避けられている様子。

関数ベース、ファイルベースでモジュールをわけることで表現できないか。

uuyu-guuyu-g

ちょっと試したのはこんな感じ。

Person.ts
export type Person = {
  name: string;
}

export const Person = {
  getName: (p: Person) => p.name,
}
main.ts
import { Person } from './Person'

const p: Person = {
  name: 'taro'
}

console.log(Person.getName(p))
// >> 'taro'
  • オブジェクトで関連する関数を export してるからツリーシェイキングは効かない..
  • 型と関連する関数がわかりやすいとは思う
  • クラスと比べて、オブジェクトがシンプルなPOJOになるのは取り回しがしやすい
uuyu-guuyu-g

クラスでドメインモデリングするデメリットとして、ツリーシェイキングが効かないというのがあると思うけど、ライブラリとは違ってアプリケーションを実装する上ではツリーシェイキングが必要 = 不要なメソッドがあるってことでそれはドメインモデリングがうまくいってないってことなんじゃないかと思うんだけどどうなんだろう?

uuyu-guuyu-g

もうひとつ試したのは

Person.ts
type Person = {
  name: string;
};

export const getName = (p: Person) => p.name;

export type Type = Person;
main.ts
import * as Person from './Person.';

const p: Person.Type = {
  name: 'taro',
};

console.log(Person.getName(p));
// >> 'taro'
  • Person.Typeは冗長な気もする
  • ツリーシェイキングは効く
  • Namespace Import はエディタの補完を得づらい。(ただこれについてはこんなソリューションもある)
    https://zenn.dev/yuku/articles/4d2f665cf42385