Typescript:可以使用与“ import”无关的任意类型实例化

时间:2020-10-04 22:59:29

标签: typescript

域:

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source> 
                    <target>1.8</target>
                </configuration>
            </plugin>

我的映射器:

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;
  };
}

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

如果(部门的原始实例)返回raw;

我明白了:

部门'可以用任意类型实例化,该类型可以 与...无关

1 个答案:

答案 0 :(得分:1)

我马上看到两个问题。

问题

class DepartamentMapper<Departament>采用名称为Department的通用名称。该泛型的值与您的类Department没有任何关系,但是您给它们指定了相同的名称。这就是为什么toDomain方法出错的原因。

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

调用raw instanceof Departament时,您正在检查它是否是 Department的实例。但是您的返回类型Department声明它是泛型 Department的类型,

可能的解决方案

如果DepartmentMapper仅映射Department类对象,则它不应是通用类。将签名更改为export class DepartamentMapper implements IMapper<Departament>

如果<Department>确实是泛型,那么您需要重新考虑如何验证其类型。

问题

在同一函数中,您还有另一个错误,即返回类型。确认它是raw后,您将返回Department,但如果不是,则什么也不做。因此,您将收到错误2366“函数缺少结尾的return语句,并且返回类型不包含'undefined'”。

可能的解决方案

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