2017-02-13 7 views
1

は私が機能を持っていたと言うflowjsオブジェクトタイプは、

12:   state.result = item.result 
            ^^^^^^^ property `result`. Property not found in 
12:   state.result = item.result 
          ^^^^^^ object type 

しないのはなぜこのです。TypeCheck?私は正確なオブジェクト型表記?{|+type?: ?string|}の型を定義していないので、追加のキーを許可しないでください。正確なオブジェクト表記はどのように機能しますか?そして、どうすればこのような部分的なオブジェクト型を定義できますか?それも可能ですか?

+0

引数 'item'には' result'というプロパティはありません。代わりに 'state.result = item.type'を書くことを意味しましたか? (ただし、そこにはヌルチェックが必要です)。 –

+0

申し訳ありませんが私の質問が不明な場合は、自由に編集してください。私は、このオブジェクトには多くのキーがありますが、そのすべてが列挙できるわけではないことを意味しています。なぜ、「正確なオブジェクト」表記を使用しなかったためにフローが型チェックに失敗したのか理解できません。私は質問を明確にすることができます(ちょっと編集して自由に感じてください!) –

答えて

1

引数がitemの場合、のいずれかの文字を符号化しようとしているようですが、というプロパティがあります。これは、フローでエンコードマップ、のように聞こえる:

{ [key: KeyType]: ValueType }; 

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

const example = (item : ?{[key: string]: string}) : {+result: ?string} => { 
    const state = {} 
    if(item) 
    { 
    state.result = item.result; 
    } 
    return state 
} 

注意、あなたがitemにヌルチェックをしなければならないか、そうでなければしませんこれは、関数シグニチャでnullableとして宣言しているためです。

必要なプロパティがある場合は、itemです。交差タイプを使用してその制約を追加できます。

type Item = {[key: string]: string} & {type: string} 

const example = (item : ?Item) : {+result: ?string} => { 
    const state = {} 
    if(item) 
    { 
    state.result = item.result; 
    } 
    return state 
} 


example({type: 'blah', x: '2'}); // OK 
example({'blah', x: '2'}); // Error: type is missing 
+0

アイテムにいくつかのキーの存在を強制することは可能ですか? –

+0

私がまだ理解していない1つの質問は、正確ではないオブジェクトの表記法は何ですか? –

+0

正確なオブジェクト記法はこの部分です: '{type:string}'。しかし、私は '&'を使ってmap型と組み合わせることもできます:**任意の**文字列プロパティを持つことができますが、**型は 'type'プロパティを持たなければなりません。 –

関連する問題