如何在 Flow 中指定一个 Moment.js 对象注解
How to specify a Moment.js object annotation in Flow
我目前正在学习 Flow,方法是将其应用于现有项目并希望将函数参数注释为 Moment.JS 对象。
使用 flow-typed 我能够为 Moment.JS 安装库定义,它似乎具有我正在寻找的类型:
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 无法识别它们。在下面的函数中 startDate
和 endDate
是 Moment.JS 日期对象。
const filterByDateWhereClause = (startDate: Moment, endDate: Moment): string => {...};
流程报错如下:
const filterByDateWhereClause = (startDate: Moment, endDate: Moment): string =>
^^^^^^ identifier `Moment`. Could not resolve name
这甚至可以通过 Flow 实现吗?或者我是否需要为 Moment.JS 对象复制与流类型提供的库定义中的对象相同的 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 => {...};
我错过了什么?
似乎从 moment 对象创建一个子类解决了这个问题:
import moment from 'moment';
class Moment extends moment {}
const filterByDateWhereClause = (startDate: Moment, endDate: Moment): string => {...};
仍然有兴趣知道这是否是注释 Moment.JS 对象的正确方法。
可通过三种方式获取所需的类型。
如果您的文件已经需要 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 => {...};
我不推荐全局使用,因为它不太明确类型的来源。
我目前正在学习 Flow,方法是将其应用于现有项目并希望将函数参数注释为 Moment.JS 对象。
使用 flow-typed 我能够为 Moment.JS 安装库定义,它似乎具有我正在寻找的类型:
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 无法识别它们。在下面的函数中 startDate
和 endDate
是 Moment.JS 日期对象。
const filterByDateWhereClause = (startDate: Moment, endDate: Moment): string => {...};
流程报错如下:
const filterByDateWhereClause = (startDate: Moment, endDate: Moment): string =>
^^^^^^ identifier `Moment`. Could not resolve name
这甚至可以通过 Flow 实现吗?或者我是否需要为 Moment.JS 对象复制与流类型提供的库定义中的对象相同的 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 => {...};
我错过了什么?
似乎从 moment 对象创建一个子类解决了这个问题:
import moment from 'moment';
class Moment extends moment {}
const filterByDateWhereClause = (startDate: Moment, endDate: Moment): string => {...};
仍然有兴趣知道这是否是注释 Moment.JS 对象的正确方法。
可通过三种方式获取所需的类型。
如果您的文件已经需要 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 => {...};
我不推荐全局使用,因为它不太明确类型的来源。