2016-12-17 4 views
11

私はフローを学習しています。したがって、私はJavaScriptとフローで少しホビープロジェクトに取り組んでいます。私はクラスFooとコンストラクタのオプションとしてFooオブジェクトの配列を取りたい別のクラスBarを持っています。しかし、私はまた、そのようなオブジェクトごとにいくつかの他のデータを送ることができるようにしたいので、それぞれの要素が普通のFooオブジェクトか、配列またはオブジェクトに包まれたFooオブジェクトのどちらかの配列を持っていたいと思います。フローのユニオンタイプの配列にオブジェクトの配列を割り当てることができません

しかし、私はこのコードを書こうとしたとき、私は理由を理解できない奇妙なエラーが出てきました。私が知る限り、タイプの競合があると考えています。Fooと互換性がありません。すべてのタイプのユニオンですが、私が理解する限り、それらの少なくとも1つと互換性があります...

ここで私は私が得た正確なエラー(link to tryflow.org example)を再現するために必要な最小限のコードは次のとおりです。

// @flow 

class Foo { } 

interface BarOptions { 
    foos: (Foo | [ Foo ] | { foo: Foo })[];   // line 6 
} 

class Bar { 
    constructor(options?: BarOptions) { } 
} 

const foo: Foo = new Foo(); 

const bar = new Bar({ 
    foos: [ foo ],         // line 16 
}); 

私は次のエラーを取得:

Line 6: 
    tuple type: This type is incompatible with Foo 
    object type: This type is incompatible with Foo 
Line 16: 
    tuple type: This type is incompatible with Foo 
    object type: This type is incompatible with Foo 

がありますこれらのエラーの直感的な(または直観的でない)理由はありますか?

答えて

2

私はBarOptionsは実際にはインターフェイスの代わりにタイプエイリアスであるべきだと思います。インタフェースdeclares a type that classes can implement。インターフェイスはデータ型ではなく、フィールド(データを含む)を持つべきではありません。

interface BarOptionsからtype BarOptions =に変更するとすべてが動作します。

別の方法としては、getter関数になるためにfooを変更することができます。

interface BarOptions { 
    foos(): (Foo | [ Foo ] | { foo: Foo })[]; 
} 
2

は、このオープンのGithub ticketに関連するかもしれないあなたと思いますか? interfacetypeに置き換えた場合、

// @flow 

class Foo { } 

type BarOptions ={ 
    foos: 
     Class<Foo> | 
     Foo | 
     Foo[] | 
     { foo: Foo } 
} 

class Bar { 
    constructor(options?: BarOptions) { } 
} 

const foo: Foo = new Foo(); 

const bar = new Bar({ 
    foos: Foo, 
// foos: foo, 
// foos: [foo], 
// foos: { foo: foo }, 
}); 
+0

これが機能すると説明できますか? (私の質問は、それを修正する方法ではなく、なぜこれが最初の問題であるかを理解しようとしている) – Frxstrem

+0

2つの違いがわかりません。私が理解しているように、どちらの場合も 'foo'は同じ型(' Foo')で宣言されますが、唯一の違いは型が暗黙的ですが、第2行目では明示的です。フロータイプの仕組みが誤って誤解されていない限り、これらの動作がどのように異なっているかはわかりません(実際にはそうであるように見えますが)。 – Frxstrem

+0

この問題はこれに関連していますか? https://github.com/facebook/flow/issues/1569 –

関連する問題