🔞

TypescriptでValueObjectを自動生成する - ts-vo-generator -

2024/06/28に公開

はじめに

ValueObject作るのめんどくね。
DDDを学習してプロダクト開発をしたことがある人なら多くの人が考えたことがあるであろうValueObjectを全部作るのか、一部作るのか、全く作らないのか。
私もメンバーと議論したことがあるのですが、開発チーム内でValueObjectを作る基準が誰が見ても明確な場合はいいですが、新しくメンバーが増えたりパートナーさんを入れたりした場合には判断基準が合間になっていきだんだんと一貫性のないコードになってしまう恐れがあります。
しかしValueObjectをいちいち全部定義するのもめんどくさい、
そんな時のためにTypescriptのConstructorからValueObjectのスケルトンコードを自動で生成するライブラリを作りました。

ts-vo-generator

https://www.npmjs.com/package/ts-vo-generator

type MountainType = {
    id: number;
    name: string;
    elevation: number;
    description?: string;
    range: string; 
}

// Mountain.ts
export class Mountain {
    private constructor(
        private id: number,
        private name: string, 
        private elevation: number,
        private range: string,
        private description?: string
    ) {}

    static new(props: MountainType): Mountain {
        return new Mountain(
            props.id,
            props.name, 
            props.elevation, 
            props.range,
            props.description
        );
    }

    public genMessage(): string {
        return `${this.name} の標高は ${this.elevation} mです。`;
    }
}

上記のようなコードから

// Id.ts
export class Id {
    private constructor(private readonly value: number) {}

    static create(value: number): Id {
        if (!Id.isValid(value)) {
            throw new Error('Invalid value');
        }
        return new Id(value);
    }

    getValue(): number {
        return this.value;
    }

    private static isValid(value: number): boolean {
        // validation logic here
        return true;
    }
}

このようなスケルトンコードが生成されます。

導入と使い方

npmで入れる場合は
npm install -g ts-vo-generator

あとはClass(DomainObject)を作成して
npx ts-vo-generator <input_file> <output_directory>
DomainObjectのファイルパスとValueObjectの出力先のディレクトリを指定するだけです。(出力先がない場合にはディレクトリごと作られます)

終わりに

現在はConstructorからしか作成できませんが他自動生成に適しているものがあれば開発を進めていこうと思います。
またスケルトンコードもこれが最適なのか怪しいので複数パターン作るか、スケルトンコードをアップデートしていこうと思っています。
もしよければ使ってみて、Github Starやissue commitお待ちしてます

参考

github
npm

Discussion