Akış

2017-03-27 45 views
7

'da bir Moment.js nesne açıklaması nasıl belirtilir Şu anda mevcut bir projeye uygulayarak ve Moment.JS nesneleri olarak işlev parametrelerine açıklama ekleyerek Flow öğreniyorum. Ben Moment.JS nesneler olarak işlev parametreleri açıklama çalıştığınızda AncakAkış

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; 
    ... 

:

flow-typed Kullanılması ben arıyorum türüne sahip görünmektedir Moment.JS için bir kütüphane tanımını yüklemek başardı Akış onları böyle tanımakta başarısız olur. Aşağıdaki işlevde startDate ve endDate Moment.JS tarih nesneleridir.

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

Akışı ile bu mümkün olabilir mi:

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

Akış aşağıdaki hatayı veriyor? Veya type'un Moment.JS nesnesi için akış tipi tarafından sağlanan kitaplık tanımındakiyle aynı olması gerekir mi? Bunu libdef oldukça uzun olduğu için yapmamayı tercih ederim. Ben eksik

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 => {...}; 

: Örneğin

?

import moment from 'moment'; 

class Moment extends moment {} 

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

ilgilenen bu eğer bir Moment.JS ancak nesne açıklama için doğru şekilde bilmek: bu sorunu çözer an nesneden alt sınıf oluşturma gibi

cevap

12

İstediğiniz türünü elde etmenin üç yolu vardır. Dosya zaten en moment modül olarak gerektiriyorsa size dosya içinde kaynak ama sadece türünü kullanmak istemiyorsanız

o tip

import moment from 'moment'; 

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

kullanabilmek için ya olmalıdır. O libdef modülü ihracat olarak belirtir ne çünkü

import type Moment from 'moment'; 

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

Bunu yapabilirsin: Bunu kullanabilir böylece libdef çok genel ad alanında bir tür moment$Moment beyan gibi https://github.com/flowtype/flow-typed/blob/7822da72587078a4b8e0f2b56746d0da41a3ddde/definitions/npm/moment_v2.x.x/flow_v0.34.x-/moment_v2.x.x.js#L233

Alternatif görünüyor.

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

Türün geldiği yerde daha az açık olduğu için global kullanımı tavsiye etmem.

+0

'Moment Moment' benim için çalışmaz, belki de Webpack kullanıyorum çünkü global ad alanı yok mu? İki ithalat yöntemi işe yaradı. – clhenrick

+0

Webpack, akışın nasıl çalıştığı konusunda bir etkisi olmamalıdır - Global türün neden sizin için çalışmadığından emin değilim, ancak sorun değil çünkü gerçekten kullanmamalısınız ... CONTRIBUTING.md içinde akış tipi için doc, libdef yazarlarına global olması gereken önek globals'a şunları bildirir: (https://github.com/flowtype/flow-typed/blob/316320bf2cbc48a9447e053272a5c113e6e26a8c/CONTRIBUTING.md#prefix-global-variables -ne-fiilen-gerçekten-olması-global), bu yüzden zaten bunu kullanmamalı :) –