2017-03-27 9 views
7

現在、Flowを既存のプロジェクトに適用し、Moment.JSオブジェクトとして関数パラメータに注釈を付けることでFlowを学習しています。私はMoment.JSオブジェクトとして関数のパラメータに注釈を付けるしようとすると、しかしFlow内の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-typedを使用して

フローは、フローをそのまま認識しません。次の関数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 => {...}; 

は、私が何をしないのですか?瞬間オブジェクトからサブクラスを作成しているかのように思え

答えて

12

目的のタイプを取得する方法は3つあります。

あなたのファイルが既にのmomentモジュールとして、あなたがそのタイプ

import moment from 'moment'; 

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

か、あなたのファイル内のソースちょうどタイプを使用しない場合を使用することができるはずが必要な場合。それはLIBDEFがモジュール・エクスポートとして指定するものだから

import type Moment from 'moment'; 

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

あなたはこれを行うことができます:あなたはそれを使用できるようにそのLIBDEFがあまりにもグローバルな名前空間の種類moment$Momentを宣言よう https://github.com/flowtype/flow-typed/blob/7822da72587078a4b8e0f2b56746d0da41a3ddde/definitions/npm/moment_v2.x.x/flow_v0.34.x-/moment_v2.x.x.js#L233

また、それが見えます。

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

タイプがどこから来ているのかはあまり明確ではないので、グローバルな使用は推奨しません。

+0

私はWebpackを使っているので、おそらくグローバルな名前空間がないので、 'moment $ Moment'は私にとってはうまくいかないでしょうか? 2つのインポートメソッドが機能しました。 – clhenrick

+0

Webpackはフローの実行方法に影響を与えません。グローバルタイプがなぜ機能しないのか分かりませんが、実際には使用しないでください。 CONTRIBUTING.mdドキュメンテーションは、フロータイプのために、libdefの作成者に、グローバルではないグローバルに接頭辞を付けるよう指示します。(https://github.com/flowtype/flow-typed/blob/316320bf2cbc48a9447e053272a5c113e6e26a8c/CONTRIBUTING.md#prefix-global-variables本当に意味のあるものであることを意味します)、とにかくそれを使用すべきではありません:) –

0

は、この問題を解決します。この場合はMoment.JSオブジェクトに注釈を付けるための正しい方法を知って

import moment from 'moment'; 

class Moment extends moment {} 

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

まだ興味を持って。

関連する問題