Comments (12)
Is it possible to set overloading types for function without using declare
?
from flow.
Any progress here? I think it's a quite important feature.
from flow.
// @flow
const items = [1, 2, 3];
type FirstType = ((_: 'a') => number) & ((n: 'b') => Array<number>);
const first: FirstType = (n):any => {
if (n === "a") {
return items[0];
} else if(n === 'b') {
return items;
}
}
const a: number = first('a');
const b: Array<number> = first('b');
Is partially working. From https://stackoverflow.com/questions/45481046/how-to-define-a-type-of-return-based-on-an-argument-string-flowtype-javascript
from flow.
@avikchaudhuri Is there a way to do that while also defining the function?
from flow.
It's also worth noting that you might need to use parentheses to express the union or intersection of two function types.
var a : () => A | B
is parsed as
var a : () => (A | B)
so the union of two functions is
var a : (() => A) | () => B
from flow.
The following should now work, closing.
declare function foo<B>(func: () => B): () => Promise<B>;
declare function foo<A,B>(func: (a:A) => B): (a: A) => Promise<B>;
foo(() => 0)(); // OK
foo((x: number) => "")(); // error: too few args, undefined ~/~ number
from flow.
@zeorin Your linked example does not show how one would define a function. I'm not quite sure what it does, actually, there doesn't seem to be any Javascript, just Flow type stuff. How would one use that to do something real, with JS code? You define the function XYZ, how do you annotate it to have multiple type signatures? If you follow my linked issue, I link to examples hat use an intersection type of function signatures, but that doesn't seem to work when I introduce generics, or I don't know how to do that.
from flow.
You can try intersection types. See an example at: http://flowtype.org/docs/union-intersection-types.html#_
from flow.
Thanks.
However if you wish to support .d.ts files anyways I guess flow will need to be able to consume typescript overloading style.
from flow.
No doubt. Currently we do support overloading syntax, at least in some contexts. For example, you can write:
declare class C {
foo(x: number): number;
foo(x: string): string;
}
from flow.
It does not work in other contexts as @leoasis pointed out. such as when defining a function. Flow is not able to select the right combo.
// @flow
type State = Array<number>;
type GetState = () => State;
type Action = { type: 'A' };
type Thunk = (dispatch: Dispatch, getState: GetState) => Promise<any>;
type Dispatch = ((action: Action) => Action) | ((action: Thunk) => Promise<any>);
const dispatch: Dispatch = (action) => {
if(typeof action === 'function') {
return action(dispatch, () => { return [1]; });
}
return action;
}
dispatch({ type: 'A' });
dispatch((dispatch, getState) => Promise.resolve());
Throws the following error:
9: type Dispatch = ((action: Action) => Action) | ((action: Thunk) => Promise<any>);
^ function type. Callable signature not found in
18: dispatch({ type: 'A' });
^ object literal
11: const dispatch: Dispatch = (action) => {
^ function. Could not decide which case to select
11: const dispatch: Dispatch = (action) => {
^ union type
9: type Dispatch = ((action: Action) => Action) | ((action: Thunk) => Promise<any>);
^ property `type` of object type. Property not found in
19: dispatch((dispatch, getState) => {
^ function
from flow.
Interfaces seem to have the behaviour you're looking for: #3021 (comment).
from flow.
Related Issues (20)
- Relay + graphql literals HOT 11
- [homebrew] regression test failure with 0.226.0,0.227.0 HOT 2
- FLOW BUG: This is a misplaced error HOT 3
- The `experimental.ts_syntax` doesnโt seem to do anything HOT 2
- Parameters<> does not support optional params HOT 2
- Top level exports HOT 1
- flow strict should allow unclear types for generics HOT 6
- Regression in invalid-computed-prop detection HOT 7
- Flow hangs every now and then requires restarting HOT 4
- Component syntax is not enabled HOT 5
- Alternative defaultProps not working with component syntax HOT 1
- Ability to copy all files and not only JS files when stripping types using `flow-remove-types` HOT 5
- Component syntax & unreachable code HOT 1
- Add a setting to turn off type guard removal / mutation risk check
- There is a question about `user friends` under limited login. When using limited login, the app only [get the user friends's app scoped IDs (ASIDs).](https://developers.facebook.com/docs/facebook-login/limited-login/permissions/#key-considerations-user-friends) **Can we get brief details about these user friends**, such like name, avatar, etc. It seems like we can't use graph API under limited login any more.
- [Proposal] Mark state & prop arrays in components & hooks as readonly HOT 5
- React.ElementType not working for children HOT 1
- Default arguments in an object destructure aren't checked for string literal unions HOT 1
- Regression with incompatible-type detection HOT 2
- Internal error on double underscore function name HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. ๐๐๐
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google โค๏ธ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from flow.