Flowtype:从工厂函数导出类

时间:2016-08-02 19:32:20

标签: javascript flowtype

如何导入从工厂函数导出的类型? (注意,这适用于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;
}

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

1 个答案:

答案 0 :(得分:3)

这里的问题是在工厂内声明的类不在工厂范围之外。它们是在每次调用工厂时创建的,因此通常没有任何方式可以引用它们。我们需要做的是在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;
}

使用类

这里的缺点是你正在搞乱类层次结构。正面是代码重用

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