如何在Flow

时间:2017-03-27 01:37:55

标签: javascript flowtype flow-typed

我目前通过将Flow应用于现有项目并希望将函数参数注释为Moment.JS对象来学习Flow。

使用flow-typed我能够为Moment.JS安装一个库定义,它似乎有I' m寻找的类型:

declare class moment$Moment {
  static ISO_8601: string;
  static (string?: string, format?: string|Array<string>, locale?: string, strict?: bool): moment$Moment;
  static (initDate: ?Object|number|Date|Array<number>|moment$Moment|string): moment$Moment;
  static unix(seconds: number): moment$Moment;
  static utc(): moment$Moment;
  ...

但是当我尝试将函数参数注释为Moment.JS对象时,Flow无法识别它们。在以下函数中,startDateendDate是Moment.JS日期对象。

const filterByDateWhereClause = (startDate: Moment, endDate: Moment): string => {...};

Flow会出现以下错误:

const filterByDateWhereClause = (startDate: Moment, endDate: Moment): string =>
                                                 ^^^^^^ identifier `Moment`. Could not resolve name

Flow甚至可以实现吗?或者我是否需要复制Moment.JS对象的type与flow-type提供的库定义中的对象相同?我不喜欢这样做,因为libdef相当冗长。

例如:

declare class Moment {
  static ISO_8601: string;
  static (string?: string, format?: string|Array<string>, locale?: string, strict?: bool): moment$Moment;
  static (initDate: ?Object|number|Date|Array<number>|moment$Moment|string): moment$Moment;
  static unix(seconds: number): moment$Moment;
  static utc(): moment$Moment;
  ...

const filterByDateWhereClause = (startDate: Moment, endDate: Moment): string => {...};

我错过了什么?

2 个答案:

答案 0 :(得分:31)

有三种方法可以获得您想要的类型。

如果您的文件已经需要moment作为模块,那么您应该可以使用该类型

import moment from 'moment';

const filterByDateWhereClause = (startDate: moment, endDate: moment): string => {...};

或者如果您不使用源,而只使用文件中的类型。

import type Moment from 'moment';

const filterByDateWhereClause = (startDate: Moment, endDate: Moment): string => {...};

您可以这样做,因为这是libdef指定为模块导出的内容: https://github.com/flowtype/flow-typed/blob/7822da72587078a4b8e0f2b56746d0da41a3ddde/definitions/npm/moment_v2.x.x/flow_v0.34.x-/moment_v2.x.x.js#L233

或者,看起来libdef在全局命名空间中声明了一个类型moment$Moment,所以你可以使用它。

const filterByDateWhereClause = (startDate: moment$Moment, endDate: moment$Moment): string => {...};

我不建议全局使用,因为它的类型来源不太明确。

答案 1 :(得分:0)

似乎从当前对象创建子类解决了这个问题:

import moment from 'moment';

class Moment extends moment {}

const filterByDateWhereClause = (startDate: Moment, endDate: Moment): string => {...};

仍然有兴趣知道这是否是正确注释Moment.JS对象的方法。