2017-02-13 5 views
11

私は、次の定数文字列があるとしましょう:フロー定数文字列とタイプ、および依存型

export default const FOO = 'FOO'

は、私はそうのように流れ、注釈付きのファイルでこれをインポート言う:

import FOO from '../consts/Foo'

私は次に機能を持っています:

const example = (foo : string) : {| type: FOO, foo: string |} => { 
    return {type: FOO, foo: foo} 
} 

これはとです。TypeCheckません。だから私の質問はあり

6: const example = (foo : string) : {| type: FOO, foo: string |}=> { 
                 ^^^^^^^^^^^^^^ string. Ineligible value used in/as type annotation (did you forget 'typeof'?) 
    6: const example = (foo : string) : {| type: FOO, foo: string |}=> { 
                 ^^^^^^^^^^^^^^ FOO 

1)それはどのように私はこの現象を再現することができ、フロータイプで定数を使用することは可能でしょうか?

2)フローで依存型を実行することは可能ですか?たとえば、タイプによって、返される文字列がexample関数に渡される文字列と同じである必要があります。

EDIT:パート2への明確化:それはexample関数に渡されたfooパラメータが実際に戻りオブジェクト内のfooキーで文字列と同じ文字列であることを示す何らかの方法ですることは可能ですか?または、入力と出力の長さが同じであることを宣言することができます(たとえば、シフト暗号関数)。または同じ文字の並べ替えを含むと言う? (シャッフル用)。

https://en.wikipedia.org/wiki/Dependent_type

+0

'FOO'型に' 'FOO''を指定したい場合、それを宣言する必要があります。それ以外の場合は単なる文字列です。オブジェクトの場合は、エラーのように 'type:FOO '型を実行します。私はあなたがあなたの2)の点で尋ねているものはかなり確信していません。次に、同じ文字列値を持つ2つのプロパティを持つオブジェクトになります。 – loganfsmyth

答えて

5

代わりのconstとしてFOOを宣言し、一つだけの枝と互いに素労働組合としてそれを宣言する:

type FOO = "FOO" 

次に、あなたのコードは次のように更新することができます。

const example = (foo : string) : {| type: FOO, foo: string |} => { 
    return {type: "FOO", foo: foo} 
} 

正確な文字列リテラル以外の任意の値を使用する場合は、 FOO必要な場合、コンパイルエラーです。

定数を保持したい場合は、衝突するようにタイプを異なるように指定する必要があります。だから、あなたができる:式互いに素組合の定義構文は、彼らだけが定数である場合でも、リテラルとタイプではなく、変数を許可するため

const FOO = "FOO" 
type FooType = "FOO"; 

const example = (foo : string) : {| type: FooType, foo: string |} => { 
    return {type: FOO, foo: foo} 
} 

を残念ながら、私は、文字列リテラルの重複を回避する方法を見ることはできません。

+0

Flux標準アクションパターンでは、アクションタイプを文字列として定義して、コードからいくつかのクォートマークをクリアします。これは非常に興味深いパターンです。こうすれば、私が間違っていれば私を修正して、私はメタタイプを定義できます。 'ValidResponses = FOO | BAR;を呼び出して、API関数呼び出しが正しいタイプのデータだけでなく正しい応答を返すようにします。 – ermik

関連する問題