【问题标题】:Flowtype: Exporting class from a factory functionFlowtype:从工厂函数中导出类
【发布时间】:2018-05-03 00:07:56
【问题描述】:

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

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

【问题讨论】:

    标签: javascript flowtype


    【解决方案1】:

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

    【讨论】:

    • 接口的解决方案是我认为我必须要做的。它有效,只是声明两次注释很痛苦。由于依赖项被注入工厂,我们无法将类移出工厂。感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 2018-06-02
    • 2022-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多