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)
- [flow-remove-types] doesn't remove some types HOT 1
- flow_parser.js file increased from 0.7M to 2.7M in v0.210 HOT 4
- `Omit` does not work well with unions HOT 3
- ☂️ Known unsoundness issues
- Partial type does not accept plain empty object literal as a default HOT 5
- Cannot return class type as T: Cannot return `root(...)` because a call signature declaring the expected parameter / return type is missing in `SomeModel` [1] but exists in function type [2].Flow(prop-missing) HOT 2
- Does not narrow down type after undefined/falsy check HOT 1
- Recursive/deep Partial HOT 2
- Bugs in negated `instanceof` expressions HOT 1
- [Question]: How to fix flowgen test after flow update HOT 3
- [Discussion]: Any plans to make Flow more interpopble with TS ecosystem? HOT 5
- Higher order type parameter support HOT 1
- Readme links to 404
- Strange index signature error if you use $Keys<O> instead of the equivalent literal union inside $ReadOnlyArray HOT 1
- [homebrew] automation script needs update HOT 2
- "Unxepcted identifier, expected the token ;" when using await inside of ES module HOT 3
- Can't iterate through chars in a string HOT 4
- Flow does not catch invalid switch statements HOT 1
- Conditional type only works if I inline it HOT 5
- Object with null prototype does not extend interface {} HOT 3
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.