私は現在、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-typeで提供されるライブラリ定義のオブジェクトと同じ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 => {...};
何が欠けていますか?
必要なタイプを取得するには3つの方法があります。
ファイルにモジュールとして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がモジュールのエクスポートとして指定しているためです : flow_v0.34.x-/moment_v2.xxjs#L233
あるいは、libdefがグローバル名前空間でもmoment$Moment
型を宣言しているように見えるので、それを使用できます。
const filterByDateWhereClause = (startDate: moment$Moment, endDate: moment$Moment): string => {...};
型がどこから来ているのか明確ではないので、私はグローバルな使用をお勧めしません。
瞬間のオブジェクトからサブクラスを作成すると、この問題が解決するかのようです。
import moment from 'moment';
class Moment extends moment {}
const filterByDateWhereClause = (startDate: Moment, endDate: Moment): string => {...};
ただし、これがMoment.JSオブジェクトに注釈を付ける正しい方法かどうかを知りたいと思っています。