如何导入从工厂函数导出的类型? (注意,这适用于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;
}
现在,有没有办法在工厂函数中导出类而不必复制类型声明?
答案 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;
}