web-dev-qa-db-ja.com

フローでMoment.jsオブジェクトアノテーションを指定する方法

私は現在、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はそれらをそのように認識できません。次の関数では、startDateendDateは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 => {...};

何が欠けていますか?

19
clhenrick

必要なタイプを取得するには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 => {...};

型がどこから来ているのか明確ではないので、私はグローバルな使用をお勧めしません。

34
Lewis Chung

瞬間のオブジェクトからサブクラスを作成すると、この問題が解決するかのようです。

import moment from 'moment';

class Moment extends moment {}

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

ただし、これがMoment.JSオブジェクトに注釈を付ける正しい方法かどうかを知りたいと思っています。

0
clhenrick