2017-05-09 15 views
0

型定義に、パラメータ型によって異なる戻り型がある多型メソッドを指定する適切な方法はありますか?多型関数のフロータイプライブラリ定義を宣言する方法

index.js:

// @flow 
import {func1} from './lib1'; 
const s: string = func1('string'); 
const b: boolean = func1(); // should cause type error but does not! 

lib1.js:

export function func1(p) { 
    return (typeof p === 'string') ? p : 0; 
} 

DEFS/lib1.js.flow

// @flow 
declare module "lib1" { 
    declare export function func1(p: string): string; 
    declare export function func1(_: void): number; 
} 

.flowconfig:

[libs] 
defs/ 

index.js(4)にエラーメッセージが表示されることを期待していましたが、フローはエラーにはなりません!

答えて

1

はい、あなたが与えた例は、オーバーロードされた関数を宣言する方法です。ただし、第2ラインを変更することがあります。

declare function myFunc(_: void): number; 

フロー関数は(not for much longerが)あまりにも多くの引数で呼び出すことができますので、それは関数がで呼び出された場合でも、2番目のオーバーロードを選択することができ文字列。私が提案する変更は、引数がundefinedでなければならないようにします(これは、引数を省略すると暗黙的に渡されるものです)。

+0

ありがとうございましたNat!残念ながら、期待どおりに動作しません。私は完全な例で質問を修正しており、indfex.js(4)でエラーが発生すると予想していましたが、フローは不平を言っていません。 – doberkofler

+0

ライブラリ定義と実装ファイルを統合しています。実装ファイルを調べる '。/ lib1'からインポートしています。 'lib1.js'の上部に' @flow'がないので、あなたはその関数の使用について型チェックを受けていないようです。 'lib1'からインポートした場合、フローはライブラリ定義ファイルを見ます(しかし、実行時には見付かりません)。 –

+0

私はおそらく私の例で間違いを犯しましたが、今は混乱しています。 lib1.jsはタイプの指定されていない外部ライブラリの例であり、defs/lib1.js.flowはlib1.jsにない型情報を追加するライブラリ定義ファイルです。ライブラリへのアクセス権がないため、ライブラリ定義ファイルを正確に追加する必要があることは私の理解です。 – doberkofler

関連する問題