🦁

値オブジェクトで状態(enum)を管理したい(DDD)

2022/02/26に公開

値オブジェクトで状態(enum)を管理したい(DDD)

  • タグの値オブジェクトがあって、「draft・open・onlyMember」の3つの状態を管理したい。
  • これら以外のタグ名で値オブジェクトを生成しようとしたらエラーが発生する
  • ついでに補完を効かせたい

コード

import { ValueObject } from '@/domain/shared/valueObject';

export interface ITag {
  tag: string;
}


export const TagType = {
  draft: '下書き',
  open: '公開',
  onlyMember: 'メンバーのみ',
} as const;

export type TagType = typeof TagType[keyof typeof TagType];


export class Tag extends ValueObject<ITag> {
  public get tag() {
    return this.props.tag;
  }

  private constructor(props: ITag) {
    super(props);
  }

  public static create(props: ITag): Tag {
    const tagList = Object.values(TagType);
    if (!tagList.find((tag:TagType)=> tag === props.tag)) {
      throw new Error('タグ名が誤っています。');
    }
    return new Tag(props);
  }
}

テスト

jest

import { ITag, Tag, TagType } from "@/domain/tag/tag";

describe('タグ', (): void => {
  // 正常系のテスト
   test('タグの値オブジェクトを生成できる', () => {
     // 「TagType.」とまで打てばIDEの補完機能で
     // 「draft・open・onlyMember」のいずれかが表示されるので便利
     const draft:ITag = {tag: TagType.draft}
     // 上記で生成したのを引数に値オブジェクトを生成
     const actual = Tag.create(draft);

     // 生成されている
     expect(actual).toBeInstanceOf(Tag);
     expect(actual.tag).toBe(draft.tag)
   });

  // 以上系のテスト
  test('想定していないタグで値オブジェクトは生成できない', () => {
    // 想定していない間違ったタグ
    const bad:ITag = {tag: "bad"}
    // 値オブジェクトを生成するとエラーが起きる
    expect(() => {
      Tag.create(bad);
    }).toThrowError('タグ名が誤っています。');
  });
});


Discussion