2017-03-29 13 views
1

"math.js"という名前のファイルにこれがあるとします。フロー宣言ファイル - 開始

function double(n) { 
    return n * 2; 
} 

exports.double = double; 

私は、パラメータを宣言し、「math.js.flow」という名前の別のファイルに「二重の」関数の型を返すようにしたい場合は、私はそのファイルに何を入れますか?

+0

なぜそれをしたいのですか?あなたは何を達成しようとしていますか? –

+0

タイプを別々のファイルに保存するための構文を理解したいと思います。ほとんどの場合、ファイルに直接型を入れます。他のオプションの実際の例を見たいだけです。 –

+0

@NatMote '.js.flow'ファイルをnpmパッケージで公開すると、' flow'はあなたのパッケージのエクスポートの使用法をタイプチェックします。これが '.js.flow'ファイルの主な目的です。 – Andy

答えて

0

.js.flowファイルはソースファイルと同様に扱われます。私はあなたが私はより良い助言を与えることができるかもしれない達成しようとしている正確に何を知っていたならば、再び

function double(n: number): number { 
    return n * 2; 
} 

exports.double = double; 

かかわら:だからあなたの例のためにあなたは、このような何かを行うことができます。通常は、ソースファイルに正しく注釈を付けるだけです。

+0

私は、通常、ソースファイルに注釈を付けるのが最善であることに同意します。しかし、誰か(私ではない)が、コードが実行される前にタイプを取り除くソフトウェアの使用を要求することに反対したとします。彼らはタイプを別々のファイルに指定し、オリジナルを純粋なJSのままにしたいかもしれません。私はそれがどのように機能するのか理解したい。あなたの例を見ると、実際に.js.flowファイルに関数の実装を指定する必要がありますか?私は型シグネチャを指定したいだけです。 –

+0

もちろん、その場合はカップルのオプションがあります。私はあなたがコメントでフロータイプを入れることができると信じています(私はそれをやったことはないと私はドキュメントがどこにあるか分からない)。そうすれば、実行する前にそれらを取り除く必要はありません。あなたの '.js.flow'ファイルでは、' declare function double(n:number):number'のようなものを使用して、実装全体を含むことを避けることもできます。私はこれらのことのいずれかを行っていないので、私は100%確信していませんが、調べる価値があります。 –

+0

これはまさに私が得ようとしていることです... "declare"の使用。私は単純で実用的な例は得られません。 –

3

あなた.js.flowファイルでこれを置く:

declare function foo(): void; 
declare module.exports: typeof foo; 

また.js.flowファイルを生成することができます:あなたの.jsモジュールは、その後module.exports = function foo()が含まれている場合は、次の操作を行う必要があること

// @flow 

declare export function double(n: number): number; 

注意をflow gen-flow-filesコマンドを使用します。執筆時点ではバグがあり、失敗することもあるので、私はまだ.js.flowファイルを手作業で書いていますが、成功すれば.js.flowフォーマットの多くの側面をリバースエンジニアリングすることができます。

+0

これは私の経験でFlowの中で最も不満足な部分です。 'あなたは、エクスポート関数double(n:number):number;の宣言は私のために働いていません。文字列で 'double'を呼び出し、Flowに' No Errors! 'というコードを書くことができます。 'flow gen-flow-files math.flow> math.flow.js'を使うと、'ファイルの先頭に@flowがありません! 'というコメントを含むファイルが生成されます。もちろんそれはしません。何らかの理由で私が変更できないファイルのタイプをどのように指定できるかをデモしようとしています。 –

+0

私にとっての結論は、実際に動作する '.js.flow'を使用する例はまだ見ていないので、私が知る限り、Flowで型を指定する方法が壊れています。私は間違っていると証明されるのが大好きです。 –

+0

@MarkVolkmannよく、 '// @ flow'を追加できないモジュールをタイプチェックできません。しかし、 '.js.flow'があればそれを使用するモジュールを型チェックできます。あなたのコードをGitHubの要点に入れると、私は一見して何が間違っているかを見ていきます。私は '.js.flow'ファイルをしばらく問題なく使用してきました。 – Andy

0

編集:コード内のエラーを修正し、余分な情報

math.js.flow

// @flow 

declare module.exports: { 
    double: (n: number) => number; 
} 

math.js

function double(n) { 
    return n * 2; 
} 

exports.double = double; 

index.js

const double = require('./math').double; 

console.log(double(20)); 

はここですあなたができるイメージ要するにthisthis

を参照してください、declare export function double(n: number): number;が動作しない理由について、あなたのコメントに答えるために

Simple working example

作業流れ/フォルダのレイアウトを参照してください、declare exportはES6の名前の輸出を宣言するために使用されますモジュール、例えばexport const foo = 'bar'。あなたの数学モジュールはCommonJsモジュールなので、declare module.exports: ...構文を使用する必要があります

関連する問題