Search code examples
flowtypeflow-typed

How to declare a flowtype library definition for polymorphic functions


What is the proper way to specify the type definitions a polymorphic method that depending on the parameter types has different return types?

index.js:

// @flow
import {func1} from './lib1';
const s: string = func1('string');
const b: boolean = func1(); // should cause type error but does not!

lib1.js:

export function func1(p) {
    return (typeof p === 'string') ? p : 0;
}

defs/lib1.js.flow

// @flow
declare module "lib1" {
    declare export function func1(p: string): string;
    declare export function func1(_: void): number;
}

.flowconfig:

[libs]
defs/

I would have hoped to received an error message in index.js(4) but flow does not complain!


Solution

  • Yes, the example you gave is how to declare an overloaded function. However, you may want to change the second line to:

    declare function myFunc(_: void): number;
    

    Since Flow allows a function to be called with too many arguments (though not for much longer), it may select the second overload even if the function is called with a string. The modification I suggest makes it so the argument must be undefined (which is what is implicitly passed if you just leave off an argument).