私はフローを学習しています。したがって、私は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
がありますこれらのエラーの直感的な(または直観的でない)理由はありますか?
これが機能すると説明できますか? (私の質問は、それを修正する方法ではなく、なぜこれが最初の問題であるかを理解しようとしている) – Frxstrem
2つの違いがわかりません。私が理解しているように、どちらの場合も 'foo'は同じ型(' Foo')で宣言されますが、唯一の違いは型が暗黙的ですが、第2行目では明示的です。フロータイプの仕組みが誤って誤解されていない限り、これらの動作がどのように異なっているかはわかりません(実際にはそうであるように見えますが)。 – Frxstrem
この問題はこれに関連していますか? https://github.com/facebook/flow/issues/1569 –