2017-07-07 15 views
8

私はそれがin TypeScriptがそうであるようにin Flowをチェック入力するには、このコードを期待していた。なぜ、返されたものに基づいて関数の型が推測されないのですか?

var onClick : (() => void) | (() => boolean); 
onClick =() => { return true; } 

代わりに、私はこのエラーを取得:

4: onClick =() => { return true; } 
      ^function. Could not decide which case to select 
3: var onClick : (() => void) | (() => boolean); 
       ^union type 

は、この設計上の決定のための一般的な名称があり、そして何でありますその背後にある推論?

returnステートメントから関数の戻り値の型を推測するようにFlow checkerに依頼することはできますか?

+0

私はあなたのための答えを持っていないが、しかし、なぜありません'(()=> Promise | void)'を実行しますか? – loganfsmyth

+0

それは異なることを意味します: '()=> A | Bは単なる関数であり、時にはAを返し、他の時はBを返し、(()=> A)| (()=> B) 'は常に' A'を返す関数か常に 'B'を返す関数のいずれかです。例えば、 –

+0

。 5行目のコールにカーソルを合わせてください:https://www.typescriptlang.org/play/index.html#src=const%20f%20%3D%20(x)%20%3D%3E%20console.log( 20%3D%3E%20Promise%3Cvoid%3E)%3B%0D%0Avar%20onClick%20%3A%20(()%20%3D%3E%20void) %3B%0D%0AonClick%20%3D%20%%20%%3D%3E%20F%22%%22%%3B%0D%0A%0D%0AonClick()%3B –

答えて

4

あなたは明示的なキャスト、例えば提供するために、いずれかの必要があります。実存タイプ、例えば

type FuncV =() => void; 
type FuncB =() => boolean; 
var onClick : FuncV | FuncB; 

onClick = (() => { return true; }: FuncB); 

をまたは使用:

type Func<T: (void | string)> =() => T; 
var f: Func<*>; 

f =() => { return "hello"; }; 
var msg = f() + " world!"; // type checks against return value above 
+0

私は回避する方法があることを知っています。それがTSとGlowの大きな違いのように思えたので、なぜこれが選ばれたのか不思議でした。 –

+0

良い追加/編集!それでも詳細と推論について興味がありますが、これらの回避策は:-) –

+0

を待つ必要があります。これは 'f:()=>(void | string)'と同じです。ああ! –

関連する問題