私はエラーなしで、このコードのタイプをチェックドキュメントページhttps://flowtype.org/docs/union-intersection-types.html#_関数の交差型は、どちらの型宣言も受け入れないのはなぜですか?
から例に
/* @flow */
class Foo {}
class Bar {}
declare var f: ((x: Foo) => void) & ((x: Bar) => void);
f(new Foo());
を取って。
私の場合、結果はすぐには分かりません。
それらは別の例でどこページの上部付近に表示されるように:
/* @flow */
type I = {a: number} & {b: number};
var x: I = {a: 1, b: 2};
x = {a: 1, b: 2, c: "three"};
(用語の意味自体から流れる)交差点は、2(またはそれ以上)の種類の化合物です。基本的にはAND
です。
なぜ、f(new Foo());
はタイプチェックに失敗しないのですか? new Foo()
引数は明らかにBar
のインスタンスではないため、渡す必要はありません。
私には何が欠けていますか?私は|
と&
スワップの意味は、あなたが(type
またはインプレースタイピング対)declare var
を使用するときにことを発見したいくつかのより多くの研究の後
UPD
。私はそれが最初の場所でも起こる理由を説明することはできません。
私はドキュメントを引用するだけです: "交差型はすべての入力タイプに値が必要です:"。この例では、 'f(new Foo());'は '((x:Bar)=> void)型ではないので、引数はこれを満たしません。 – zerkms
別の論争の例: 'var'を宣言し、' type'が異なる振る舞いを宣言します。https://flowtype.org/try/#0PQKgBAAgZgNg9gdzCYAoAxjAhgZx2AMTjjAG8BfDbPMAISwCczKATAU00bbABcBPAA7cCYALxgAFBIAeALkLEAlGIB8YAG5wAli2UAySTPn0Gy0Ws07FAblSp1jMFjDyR4qAFcAduh5a4XjIuCnDKFKhYEl5sSERwEoo2QA – zerkms
うーん、私は非常に次はないよ: '(X:バー)=> void'型は 'f(new Foo())'ではなく 'f'自身のためのものです。 'f'関数は型'(x:Foo)=> void'と型 '(x:Bar)=> void'の両方であると言っています。そのように、 'Foo'型の引数で呼び出すのはいいです。 –