2017-01-15 8 views
2

この場合、クラス定義のすべてのメンバーをコピーアンドペーストせずにクラス宣言を再利用するにはどうすればよいですか?クラス定義の再利用フロークラス宣言

declare type A { 
a: string; 
} 

class A extends EventEmitter { 

foo() { 
    this.a // error property not found 
} 
} 

私は、流れがclass Aがtype Aのインスタンスですが、そうでないことを認識するだろうと思いました。

+0

'declare type 'で宣言した' A'は、 'class A'で定義した' A'と同じではありません。あなたが探しているものは基本クラスですが、いつも 'EventEmitter'を拡張する必要がないので、できません。 –

+0

クラスAの型を宣言するにはどうすればよいですか? –

+0

クラスAの型が自動的に作成されます。宣言することはできません。 –

答えて

4

typeはFlowで何を意味するのか誤解していると思います。

まず、あなたのコードには、Aという2つのものがあります。それらは重複しています。のは、それらの名前を変更してみましょう、私たちは適切にそれらについて話すことができる:ここでは

type T { 
    a: string; 
} 

Tは数あるaと呼ばれる性質を持つ任意のJavaScriptオブジェクトです。

class C extends EventEmitter { 
    foo() { 
    this.a // error property not found 
    } 
} 

Cは、あなたのクラスの名前ですが、フローはCまたはCのサブクラスのインスタンスであるすべてのオブジェクトの種類で同じ名前の種類を作っています。 Cにはaという属性がないため、エラーが予想されます。 T)でないため、Tにすることはできません。それTにする唯一の方法はそれをa: number属性与えることです:

class C extends EventEmitter { 
    a: number; 
    foo() { 
    this.a 
    } 
} 

をそして、それはTのインタフェースに準拠しているため、今Cの任意のインスタンスもTです:

const t: T = new C(); // this is now ok 

元の質問は、属性の重複を避けることです。フローはclassesを定義するための追加のショートカットを提供しませんが、タイプを定義するためのショートカットをmixinsで提供しています。しかし、私はそれがあなたが望むものを正確に行うとは思わない。あなたのような何かを行うことができます:

declare class SharedProps { 
    a: number; 
} 
declare class A mixins SharedProps { 
    b: string; 
} 

しかし、これが唯一の種類、ないの実装を宣言します。クラスをどこかで実装する必要がありますが、これではあまり労力を節約できません。

+0

@peterhallありがとう、私はすでにこのコンセプトを理解しています。これは、クラスのサポートが非常にまれであることを示していると思います。私の現在の状況は、すべてのクラスのために余分なタイプを管理するように強制しています。他の誰かがショーストッパーとしてこれを見ることを願っています。 –

+0

私はフローリポジトリhttps://github.com/facebook/flow/issues/3211に問題を作成しました –

関連する問題