【问题标题】:How to declare a flowtype library definition for polymorphic functions如何为多态函数声明流类型库定义
【发布时间】:2017-05-09 15:34:13
【问题描述】:

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

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 不会抱怨!

【问题讨论】:

    标签: flowtype flow-typed


    【解决方案1】:

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

    declare function myFunc(_: void): number;
    

    由于 Flow 允许使用太多参数调用函数(尽管 not for much longer),因此即使使用字符串调用函数,它也可能选择第二个重载。我建议的修改使它的参数必须是undefined(如果你只是省略一个参数,这是隐式传递的)。

    【讨论】:

    • 感谢您的帮助纳特!不幸的是,它没有按预期工作。我已经用一个完整的示例修改了我的问题,并且预计会在 indfex.js(4) 中出现错误,但 flow 不会抱怨。
    • 您将库定义与实现文件混为一谈。您正在从./lib1 导入,它查看实现文件。看起来您没有对该函数的使用进行类型检查,因为lib1.js 顶部没有@flow。如果您从lib1 导入,Flow 将查看库定义文件(但在运行时当然不会找到它)。
    • 我可能在我的示例中犯了一个错误,但现在,我很困惑。 lib1.js 将是非类型化外部库的示例,而 defs/lib1.js.flow 将是添加 lib1.js 中缺少的类型信息的库定义文件。据我了解,我必须添加库定义文件正是因为我无权访问该库。
    • 只需删除 lib1.js 并更改导入 lib1(不是相对导入)。这将模拟您所询问的情况。
    猜你喜欢
    • 2018-06-06
    • 2017-05-30
    • 2017-08-16
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多