【问题标题】:Typescript:could be instantiated with an arbitrary type which could be unrelated to 'import打字稿:可以用与“导入”无关的任意类型实例化
【发布时间】:2021-01-19 20:22:44
【问题描述】:

域:

export interface IDepartamentProps {
  departament_name: string;
  manager_id: string;
}
export class Departament extends AggregateRoot<IDepartamentProps> {
  get DepartamentName(): string {
    return this.props.departament_name;
  }
  get ManagerID(): string {
    return this.props.manager_id;
  }
  private constructor(props: IDepartamentProps, id?: string) {
    super(props, id);
  }
  public static create = async (
    props: IDepartamentProps,
    id?: string,
  ): Promise<Departament> => {
    const guardedProps = [
      { argument: props.departament_name, argumentName: 'departament_name' },
      { argument: props.manager_id, argumentName: 'manager_id' },
    ];
    const guardResult = Guard.againstNullOrUndefinedBulk(guardedProps);
    if (!guardResult.succeeded) throw new Error(guardResult.message);
    const departament = new Departament(props, id);
    const idWasProvided = !!id;
    if (!idWasProvided) {
      departament.when(new LocationCreatedEvent(departament));
    }
    return departament;
  };
}

我的映射器:

export class DepartamentMapper<Departament> implements IMapper<Departament> {
  constructor(private departamentCreator: DomainCreator<Departament>) {}
  toPersistence(t: any): Departament {
    throw new Error('Method not implemented.');
  }
  public toDomain = (raw: any): Departament => {
    if (raw instanceof Departament) return raw;
  };
}

但由于某种原因,在检查该值是否是我部门的实例时出现错误:

if (raw instanceof Departament) return raw;

我明白了:

Departament' 可以用任意类型实例化,该类型可以 无关

【问题讨论】:

    标签: typescript


    【解决方案1】:

    我马上就发现了两个问题。

    问题

    class DepartamentMapper&lt;Departament&gt; 采用名称为 Department 的泛型。这个泛型的值与你的类Department 无关,但是你给了它们相同的名字。这就是您在 toDomain 方法中遇到错误的原因。

      public toDomain = (raw: any): Departament => {
        if (raw instanceof Departament) return raw;
      };
    

    当您调用raw instanceof Departament 时,您正在检查它是否是 Department 的实例。但是您的返回类型 Department 声明它属于 generic Department,可以是任何东西。

    可能的解决方案

    如果DepartmentMapper 只映射Department 类对象,那么它不应该是泛型类。将签名改为export class DepartamentMapper implements IMapper&lt;Departament&gt;

    如果&lt;Department&gt; 确实是一个泛型,那么您需要重新考虑如何验证它的类型。

    问题

    在同一个函数中,您还有另一个错误,即返回类型。当您验证它是 Department 时,您返回 raw,但如果不是,您什么也不做。所以你会得到错误 2366“函数缺少结束返回语句并且返回类型不包括'未定义'”。

    可能的解决方案

    1. 将返回类型改为Department | undefined
    2. 如果raw 不是Department,则抛出Error
    3. 把它变成guard function,它基本上是一个布尔值,当true时缩小输入的类型。在这种情况下,它有点简单,不依赖于实例,因此它可能是静态的。但下面是这种方法的样子:
    public isDepartment = (raw: any): raw is Departament => {
        return raw instanceof Departament;
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-28
      • 1970-01-01
      • 2021-05-11
      • 2021-10-26
      • 2021-09-21
      • 2021-08-14
      • 2021-10-08
      • 2020-01-22
      相关资源
      最近更新 更多