2017-10-08 22 views
1

react-native init AwesomeProject新鮮なリアクト - ネイティブプロジェクトを作成するには、私は、生成されたApp.jsで、このクラス宣言に<{}>で混乱していた:フロータイプ注釈:なぜ `ClassName <{}>`?

export default class App extends Component<{}> { 

は最終的に私は<{}>Class Generic用フロータイプ注釈だったことを考え出しました。

私はgeneric types in Javaに精通しており、それらの有用性を理解しています。

しかし、私はフローアノテーションの目的を理解するのに苦労しています。それは何を達成するのですか?私が知る限り、AppクラスのタイプはObjectであることが検証されています。それは冗長なようだが、それが事実であれば、私はそれがこのreact-native sourceのように<Object>のように書かれることになる望んでいるだろう、で:

class AnimatedComponent extends React.Component<Object> { 

私はこのタイプのチェックの必要性を説明するために見つけることができる唯一の理由はですMDN documentation for extends

拡張子の.prototypeは、Objectまたはnullである必要があります。

は、<Object>の略語ですか?その場合は、stringを指定する型名の代わりに実際の文字列を使用することと似ていますが、これは間違っているようです。たとえば:

// @flow 
function concat(a: string, b: string) { 
    return a + b; 
} 
// as compared to --> 
// @flow 
function concat(a: "foo", b: "bar") { 
    return a + b; 
} 
  1. <{}>注釈の目的があるか、何

    は、それがコードについて検証していますか?
  2. <{}><Object>に相当しますか?
  3. 私は何かを誤解していますか?

ありがとうございました!

+0

2:NOに関しては、 '{}'注釈は封印されたオブジェクト型を定義するのに対し、 'Object'は開封されています – ftor

答えて

1

Objects (and functions) in Flow are structurally typed。つまり、{...}タイプのすべてのプロパティとタイプに一致するオブジェクトは、それのサブタイプです。 {}の場合、これにはすべての真のオブジェクト(したがって配列とリテラルを除く)と、実際にはObject === {}が含まれます。 a: "foo"ようなリテラルタイプがストリングののみこれらのインスタンスであるためstring

あなたの例、すなわち"fo""foo"のサブタイプではない、根本的に異なります。

実際の目的は、フロータイプチェッカーで特殊化されたComponentです。実際には、それらがプロパティタイプから推論できるので、ジェネリックを完全に省略することができます。最初のジェネリックパラメータは、プロップのタイプであり、2番目は、状態のタイプです。 See the docs

関連する問題