2016-08-02 5 views
1

ファクトリ関数からエクスポートされた型はどのようにインポートしますか?フロータイプ:ファクトリ関数からクラスをエクスポートする

Person.js

// @flow 

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

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

    return Person; 
} 

従業員:これは私が例えば何をしたいです(ずっと...注意、これはangularJS工場に適用されますので、我々はそれが働いている方法を変更することはできません)。 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; 
} 

ここで、型宣言を複製しなくても、ファクトリ関数でクラスをエクスポートする方法はありますか?

答えて

3

ここで問題となるのは、工場内で宣言されているクラスが工場外のスコープ内にないことです。ファクトリが呼び出されるたびに作成されるため、一般的にファクトリを参照する方法はありません。私たちがしなければならないことは、私たちが気にする型情報を持っている工場外のものを宣言することです。

はここインターフェース

ここ欠点は、あなたがタイプの一部を再宣言しているということであるを使用して、2つの提案

です。プラスの側面は、これは実行時の効果がなく、きれいです。

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

解決策は、私がしなければならないと思ったものです。注釈を2度宣言するのは苦痛です。依存関係が工場に注入されるため、クラスを工場外に移動することはできません。答えをありがとう! – Steel

関連する問題