101 votes

React propTypes : objectOf vs shape ?

Quelle est la différence entre PropTypes.objectOf y PropTypes.shape ? Dans le PropTypes :

// An object with property values of a certain type
optionalObjectOf: PropTypes.objectOf(PropTypes.number)

vs

// An object taking on a particular shape
optionalObjectWithShape: PropTypes.shape({
  color: PropTypes.string,
  fontSize: PropTypes.number
})

Quand dois-je utiliser objectOf et quand dois-je utiliser shape ?

167voto

djfdev Points 128

PropTypes.objectOf est utilisé pour décrire un objet dont les propriétés sont toutes du même type.

    const objectOfProp = {
        latitude: 37.331706,
        longitude: -122.030783
    }
    // PropTypes.objectOf(PropTypes.number)

PropTypes.shape est utilisé pour décrire un objet dont les clés sont connues à l'avance et qui peut représenter différents types.

    const shapeProp = {
        name: 'Jane',
        age: 25
    }
    // PropTypes.shape({ name: PropTypes.string, age: PropTypes.number })

1 votes

Hmm... ok je comprends. Je pense que ma confusion vient d'un manque d'imagination. Pouvez-vous donner un exemple d'un bon cas d'utilisation réelle pour PropTypes.objectOf ?

0 votes

Un cas d'utilisation serait un objet dont vous ne connaissez pas les noms des clés à l'avance. Tant que vous connaissez le type des valeurs, vous pouvez utiliser la fonction PropTypes.objectOf à valider.

2 votes

Bien, objectOf est pour un objet dictionnaire avec le même type pour toutes les valeurs.

59voto

Levi Fuller Points 3360

Je voulais juste donner un exemple avec l'objet suivant :

{
    petStore: {
        animals: {
           '23': { name: 'Snuffles', type: 'dog', age 13 }
           '29': { name: 'Mittens', type: 'cat', age: 7 }
        }
    }
}

ObjectOf et Shape

Utilisé lorsqu'un objet peut avoir différents noms de propriétés, mais un ensemble cohérent de propriétés pour chacun d'eux :

const animalItemShape = {
    name: PropTypes.string,
    type: PropTypes.string,
    age: PropTypes.number
}

const petStoreShape = {
    animals: PropTypes.objectOf(PropTypes.shape(animalItemShape))
}

Comme vous pouvez le voir, animals est un objet composé de plusieurs propriétés qui se conforment chacune à la norme animalItemShape type.

J'espère que cela vous aidera !

1 votes

J'ai utilisé PropTypes.objectOf(PropTypes.shape({...})) et cela n'a pas fonctionné - j'ai reçu un avertissement erroné disant que je "passais un objet mais que je m'attendais à une chaîne" alors que je passais une chaîne. Le site docs dire que objectOf est pour "Un objet avec des valeurs de propriété d'un certain type" comme PropTypes.number . Je pense que vous avez juste besoin PropTypes.shape({...}) sans le objectOf ce qui a fonctionné pour moi.

0 votes

@AlbertVilaCalvo Si je devais deviner, j'imaginerais que vous avez pu accidentellement passer un objet comme l'une des propriétés que vous avez définies à l'élément PropTypes.string type. A quoi ressemblait votre objet ?

3 votes

Je viens de réessayer : en utilisant PropTypes.objectOf(PropTypes.shape({...})) fait apparaître l'erreur rouge "Invalid prop...", alors que PropTypes.shape({...}) fonctionne parfaitement (aucune erreur n'est affichée). Encore une fois, la documentation indique que objectOf doit être utilisé comme PropTypes.objectOf(PropTypes.number) et est pour "Un objet avec des valeurs de propriétés d'un certain type". Il me semble que le fait d'envelopper PropTypes.shape({...}) con objectOf n'est pas nécessaire - utilisez simplement PropTypes.shape({...}) directement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X