2016-05-26 13 views
4

次のコードを仮定します最初に働いた場合。しかし、二度と真実を返すことはありません。私はそれを以下の構文に変更しようとしましたが、それは役に立たなかった。コンポーネントのpropTypesを反応させるの定義の種類

if (TestComponent.propTypes.myEnum === React.PropTypes.oneOf(['News', 'Photos'])) {...} 

したがって、問題は次のとおりです。どのようなメカニズムが小道具の種類を発見するためにありますか? 私はReactがそれを検証するpropTypeに対するpropの値をテストすることを知っています。しかし、私は私のものをするためにも '期待されたタイプ'へのアクセスが必要です。

ところで、ここでは(簡潔にするために短縮)propTypesを検証リアクトコードからの抜粋です:あなたは外側の関数のパラメータがexpectedTypeで見ることができるように

function createPrimitiveTypeChecker(expectedType) { 
    function validate(props, propName, componentName, location, propFullName){  
    var propValue = props[propName]; 
    var propType = getPropType(propValue); 
    if (propType !== expectedType) { 
     // return some Error 
    } 
    return null; 
    } 
    return createChainableTypeChecker(validate); 
} 

。内部の検証関数(if(propType!== expectedType))で使用されます。しかし、ReactはexpectedTypeをメンバ変数に保存しないので、外部コードからアクセスすることができます。だから、どのように外のコードpropypeの型を把握するのですか?

私の指摘は、小道具の特定の値を '検証'することではありません。それはReactによって非常にうまく処理されます。私のポイントは、など

任意の考え、提案、私はanyOf、objectOf、形状などの種類とに得ることができない小道具の種類に応じて、いくつかの固有のロジックを、行うことです?

+0

説明を参照してください。 これを修正する機能リクエストとPRがあります。こちらをご覧ください。+1:https://github.com/facebook/react/issues/8310 – VladFr

答えて

3

短い答えでは、異なる機能を指しているため、これを比較することはできません。 oneOfに電話すると、別の機能が返されます。

説明:ここでの問題は、React.PropTypes.oneOfが機能createEnumTypeCheckerであることです。

定義ではoneOf()を実際に呼び出す必要があるため、React.PropTypes.myEnumにはoneOf関数を呼び出す戻り値が含まれます。

oneOf()を呼び出した結果はcreateChainableTypeChecker()内で宣言、別の関数です。

は残念ながら、あなたの2回目の試行では、これらの機能が異なるためどちらか、彼らはあなたが oneOf()を呼び出すたびに作成されている動作しません。 ReactPropTypes.js

var chainedCheckType = checkType.bind(null, false); 
chainedCheckType.isRequired = checkType.bind(null, true); 

return chainedCheckType; 

ソリューションでcreateChainableTypeCheckerを参照してください:私はあなたが関数の名前をテスト提案します。これは、これが有効なReact Propタイプであることを証明します。

// returns false 
React.PropTypes.oneOf(['myArr']) === React.PropTypes.oneOf(['myArr']) 

// returns true 
React.PropTypes.oneOf(['myArr']).name == React.PropTypes.oneOf(['myArr']).name 

// this should return true in your case: 
if (TestComponent.propTypes.myEnum.name === React.PropTypes.oneOf().name) 

は残念ながら、すべてが非プリミティブpropTypes使用createChainableTypeCheckerに反応し、これは常に名前checkTypeで関数を返します。この名前がそれぞれpropypeで異なる場合、どのタイプが使用されているかを確認することができます。今のように、それがoneOfobjectOf、またはanyを含む他のどれかを知ることはできません。

+0

ありがとうございます。 – user1486016

関連する問題