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;
}
しかし、これが唯一の種類、ないの実装を宣言します。クラスをどこかで実装する必要がありますが、これではあまり労力を節約できません。
'declare type 'で宣言した' A'は、 'class A'で定義した' A'と同じではありません。あなたが探しているものは基本クラスですが、いつも 'EventEmitter'を拡張する必要がないので、できません。 –
クラスAの型を宣言するにはどうすればよいですか? –
クラスAの型が自動的に作成されます。宣言することはできません。 –