首页 > 解决方案 > Typescript 中处理错误的最佳实践

问题描述

由于我阅读了几篇关于错误处理的文章,我仍然想知道在值对象中的验证逻辑上抛出异常是否是不好的方法。例如,我在下面有这个类,它是值对象:

export class UserName {
  private readonly value: string;

  constructor(value: string) {
    this.value = this.evaluateName(value);
  }

  private evaluateName(value: string): string {
    value = value.trim();
    if (value === "") {
      throw new UserNameError("username is required!");
    }
    return value;
  }

  static userNameOf(name: string): UserName {
    return new UserName(name);
  }

  public isValidName(): boolean {
    if (!/^[a-zA-Z]+$/.test(this.value)) {
      throw new UserNameError("user name should contain only letter");
    }
    return true;
  }

}

那么,如果有最好的方法来处理错误而不是像我一样抛出错误呢?谢谢 :)

标签: typescripterror-handlingdomain-driven-designvalue-objects

解决方案


使用值对象的好处之一是它们可以强制执行自己的不变量。遵循“始终有效”原则是一个好主意,这意味着实体、聚合根和值对象永远不会处于违反其不变量的状态。

因此,从值对象中抛出异常是没有问题的。实际上,在您的示例中,它应该更严格。您当前可以创建一个无法通过 isValidName() 测试的用户名值对象,因为在完成构建之前未对其进行检查。

我会重构这个:

export class UserName {
  private readonly value: string;

  constructor(value: string) {
    trimmed: string;
    trimmed = value.trim();
    
    if (trimmed === "") {
       throw new UserNameError("Username is required!.");
    }

    if (!/^[a-zA-Z]+$/.test(trimmed)) {
      throw new UserNameError("user name should contain only letter");
    }    

    this.value = trimmed;
  }

  static userNameOf(name: string): UserName {
    return new UserName(name);
  }
}

推荐阅读