2017-01-22 9 views
5

私はエラーなしで、このコードのタイプをチェックドキュメントページ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

。私はそれが最初の場所でも起こる理由を説明することはできません。

答えて

2

私はあなたの質問を誤解しているかもしれませんが、私はそれをタイプチェックすることが期待されます。引数new Foo()はタイプFooであるため、fタイプがFoo => ...である限り、アプリケーションは正常である必要があります。します。 (でもはタイプBar => ...です)。比較のために

fはタイプ(x: Foo & Bar) => voidを持っていた場合、物事はnew Fooので、確かにタイプFooの間に、またタイプBarのではない、です。TypeCheckないでしょう。

fのタイプが((x: Foo) => void) | ((x: Bar) => void)の場合は、型チェックが行われません。引数new Fooは、タイプがFooで、fタイプがFoo => voidである場合がありますが、タイプはBar => voidです。

+0

私はドキュメントを引用するだけです: "交差型はすべての入力タイプに値が必要です:"。この例では、 'f(new Foo());'は '((x:Bar)=> void)型ではないので、引数はこれを満たしません。 – zerkms

+0

別の論争の例: 'var'を宣言し、' type'が異なる振る舞いを宣言します。https://flowtype.org/try/#0PQKgBAAgZgNg9gdzCYAoAxjAhgZx2AMTjjAG8BfDbPMAISwCczKATAU00bbABcBPAA7cCYALxgAFBIAeALkLEAlGIB8YAG5wAli2UAySTPn0Gy0Ws07FAblSp1jMFjDyR4qAFcAduh5a4XjIuCnDKFKhYEl5sSERwEoo2QA – zerkms

+0

うーん、私は非常に次はないよ: '(X:バー)=> void'型は 'f(new Foo())'ではなく 'f'自身のためのものです。 'f'関数は型'(x:Foo)=> void'と型 '(x:Bar)=> void'の両方であると言っています。そのように、 'Foo'型の引数で呼び出すのはいいです。 –

関連する問題