GithubHelp home page GithubHelp logo

function overloading about flow HOT 12 CLOSED

facebook avatar facebook commented on April 27, 2024 2
function overloading

from flow.

Comments (12)

leoasis avatar leoasis commented on April 27, 2024 24

Is it possible to set overloading types for function without using declare?

from flow.

morajabi avatar morajabi commented on April 27, 2024 9

Any progress here? I think it's a quite important feature.

from flow.

hackhat avatar hackhat commented on April 27, 2024 3
// @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.

Macil avatar Macil commented on April 27, 2024 2

@avikchaudhuri Is there a way to do that while also defining the function?

from flow.

gabelevi avatar gabelevi commented on April 27, 2024 1

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.

avikchaudhuri avatar avikchaudhuri commented on April 27, 2024 1

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.

lll000111 avatar lll000111 commented on April 27, 2024 1

@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.

avikchaudhuri avatar avikchaudhuri commented on April 27, 2024

You can try intersection types. See an example at: http://flowtype.org/docs/union-intersection-types.html#_

from flow.

fdecampredon avatar fdecampredon commented on April 27, 2024

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.

avikchaudhuri avatar avikchaudhuri commented on April 27, 2024

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.

pronebird avatar pronebird commented on April 27, 2024

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.

zeorin avatar zeorin commented on April 27, 2024

Interfaces seem to have the behaviour you're looking for: #3021 (comment).

from flow.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.