如何为多态函数声明flowtype库定义

如何为多态函数声明flowtype库定义,flowtype,flow-typed,Flowtype,Flow Typed,对于根据参数类型具有不同返回类型的多态方法,指定类型定义的正确方法是什么 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 ==

对于根据参数类型具有不同返回类型的多态方法,指定类型定义的正确方法是什么

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/

我本希望在index.js(4)中收到一条错误消息,但flow并没有抱怨

是的,您给出的示例是如何声明重载函数。但是,您可能希望将第二行更改为:

declare function myFunc(_: void): number;

由于流允许使用太多参数调用函数(尽管如此),因此即使使用字符串调用函数,它也可能选择第二个重载。我建议的修改使参数必须是
未定义的
(如果您不使用参数,则会隐式传递该参数)。

感谢您的帮助Nat!不幸的是,它没有像预期的那样工作。我已经用一个完整的例子修改了我的问题,并希望在indfex.js(4)中得到一个错误,但flow没有抱怨。您将库定义与实现文件混为一谈。您正在从查看实现文件的
/lib1
导入。您似乎没有对该函数的使用进行类型检查,因为
lib1.js
顶部没有
@flow
。如果您从
lib1
导入,Flow将查看库定义文件(当然在运行时找不到)。我在示例中可能犯了一个错误,但现在,我感到困惑。lib1.js将是未类型化外部库的一个示例,而defs/lib1.js.flow将是添加lib1.js中缺少的类型信息的库定义文件。我的理解是,我必须添加库定义文件,因为我无法访问库。只需删除
lib1.js
并更改导入
lib1
(不是相对导入)。这将模拟您询问的情况。