Flowtype:从工厂函数导出 class

Flowtype: Exporting class from a factory function

如何导入从工厂函数导出的类型? (注意,这适用于 angularJS 工厂,所以我们不能改变它的工作方式......很多)这就是我想做的,例如:

Person.js

// @flow

export default function personFactory(): Person {
  class Person {
    name: string;

    constructor(name: string) {
      this.name = name;
    }
  }

  return Person;
}

Employee.js

// @flow

// This won't work since the default export is the factory function
// but bare with me.
import type PersonType from './Person';

employeeFactory.$inject = ['Person'];
export default function employeeFactory(Person: PersonType): Employee {
  class Employee extends Person {
    job: string;     

    constructor(name: string, job: string) {
      super(name);

      this.job = job;
    }
  }

  return Employee;
}

现在,有没有办法在工厂函数中导出 class 而无需复制类型声明?

这里的问题是 class 在工厂内部声明的 es 不在工厂外部的范围内。它们是在每次调用工厂时创建的,因此通常没有任何方法可以引用它们。我们需要做的是声明 Factory 之外的东西携带我们关心的类型信息。

这里有两个建议

使用界面

这里的缺点是您要重新声明某些类型。好的一面是,这没有任何运行时效果,而且非常干净。

// @flow
export interface IPerson {
  name: string;
}

export default function personFactory(): Class<IPerson> {
  class Person {
    name: string;

    constructor(name: string) {
      this.name = name;
    }
  }

  return Person;
}

使用类

缺点是您弄乱了 class 层次结构。好的一面是代码重用

// @flow
class PersonBase {
  name: string;
  constructor(name: string) {
    this.name = name;
  }
}
export type Person = typeof PersonBase;

export default function personFactory(): Class<PersonBase> {
  class Person extends PersonBase {}

  return Person;
}