2017-07-07 48 views
8

Spodziewałem ten kod wpisać sprawdzić in Flow jak to robi in TypeScript:Dlaczego funkcja Flow nie wnioskuje o typie funkcji na podstawie tego, co zwraca?

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

Zamiast tego, otrzymuję ten błąd:

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

istnieje ogólna nazwa dla tej decyzji projektowej, a co jest rozumowanie za tym?

Czy można poprosić kontroler przepływu o wybranie typu zwrotu funkcji z instrukcji zwrotu?

+0

nie mam dla ciebie odpowiedź, ale dlaczego nie do '(() => Obiecuj | void)'? – loganfsmyth

+0

mają na myśli różne rzeczy: '() => A | B' jest pojedynczą funkcją, która czasami zwraca 'A', a inne razy zwraca' B', natomiast '(() => A) | (() => B) 'jest funkcją, która zawsze zwraca' A' lub funkcję, która zawsze zwraca 'B'. –

+0

np. najedź kursorem na połączenie w linii 5 tutaj: https://www.typescriptlang.org/play/index.html#src=const%20f%20%3D%20 (x)% 20% 3D% 3E% 20console.log (x)% 3B% 0D% 0Aar% 20onKliknij% 20% 3A% 20 (()% 20% 3D% 3E% 20void)% 20% 7C% 20 (()% 20% 3D% 3E% 20Promise% 3Unikaj% 3E) % 3B% 0D% 0AonClick% 20% 3D% 20()% 20% 3D% 3E% 20f (% 22hi% 22)% 3B% 0D% 0A% 0D% 0AonClick()% 3B –

Odpowiedz

4

Trzeba będzie albo stanowić wyraźny obsady, np

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

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

Albo użyć typu egzystencjalnego, np

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

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

Wiem, że istnieją sposoby na obejście. Ciekawe, dlaczego to zostało wybrane, ponieważ wydaje się, że to duża różnica między TS i Glow, o której wcześniej nie wspomniałem. –

+0

Dobry dodatek/edycja! Nadal ciekawi szczegółów i rozumowania, ale te obejścia będą musiały zrobić :-) –

+0

Poczekaj sekundę, to tak samo jak 'f:() => (void | string)'. d'oh! –