> ## Documentation Index
> Fetch the complete documentation index at: https://wiki.another-horizon.eu/llms.txt
> Use this file to discover all available pages before exploring further.

# Types de données complexes

> Décrivez des API avec des schémas flexibles, des propriétés facultatives et plusieurs formats de données à l’aide des mots-clés `oneOf`, `anyOf` et `allOf`.

Lorsque votre API accepte plusieurs formats de données, comporte des champs conditionnels ou utilise des modèles d’héritage, les mots-clés de composition de schémas d’OpenAPI vous aident à documenter ces structures flexibles. Avec `oneOf`, `anyOf` et `allOf`, vous pouvez décrire des API qui prennent en charge différents types d’entrée ou combinent plusieurs schémas en modèles de données complets.

<div id="oneof-anyof-allof-keywords">
  ## Mots-clés `oneOf`, `anyOf`, `allOf`
</div>

Pour les types de données complexes, OpenAPI propose des mots-clés pour combiner des schémas :

* `allOf` : Combine plusieurs schémas (comme la fusion d’objets ou l’extension d’un schéma de base). Fonctionne comme un opérateur « and ».
* `anyOf` : Accepte des données correspondant à l’un des schémas fournis. Fonctionne comme un opérateur « or ».
* `oneOf` : Accepte des données correspondant exactement à un seul des schémas fournis. Fonctionne comme un opérateur « exclusive-or ».

<Avertissement>Mintlify traite `oneOf` et `anyOf` de la même manière, car la différence pratique influe rarement sur l’utilisation de l’API.</Avertissement>

Pour des spécifications détaillées de ces mots-clés, consultez la [documentation OpenAPI](https://swagger.io/docs/specification/data-models/oneof-anyof-allof-not/).

<Info>Le mot-clé `not` n’est actuellement pas pris en charge.</Info>

<div id="combining-schemas-with-allof">
  ### Combiner des schémas avec `allOf`
</div>

Lorsque vous utilisez `allOf`, Mintlify applique un prétraitement à votre document OpenAPI afin d’afficher des combinaisons complexes de manière lisible. Par exemple, lorsque vous combinez deux schémas d’objet avec `allOf`, Mintlify fusionne les propriétés des deux en un seul objet. Cela est particulièrement utile lorsque vous exploitez les [components](https://swagger.io/docs/specification/components/) réutilisables d’OpenAPI.

```yaml theme={null}
org_with_users:
  allOf:
    - $ref: '#/components/schemas/Org'
    - type: object
      properties:
        users:
          type: array
          description: Un tableau contenant tous les utilisateurs de l'organisation
# ...
components:
  schemas:
    Org:
      type: object
      properties:
        id:
          type: string
          description: L'identifiant de l'organisation
```

<ParamField body="org_with_users" type="object">
  <Expandable>
    <ParamField body="id" type="string">
      L’identifiant de l’organisation
    </ParamField>

    <ParamField body="users" type="object[]">
      Un tableau contenant l’ensemble des utilisateurs de l’organisation
    </ParamField>
  </Expandable>
</ParamField>

<div id="providing-options-with-oneof-and-anyof">
  ### Proposer des options avec `oneOf` et `anyOf`
</div>

Lorsque vous utilisez `oneOf` ou `anyOf`, les options s’affichent dans un conteneur à onglets. Indiquez un champ `title` dans chaque sous-schéma pour nommer vos options. Par exemple, voici comment vous pourriez afficher deux types d’adresses de livraison distincts :

```yaml theme={null}
delivery_address:
  oneOf:
    - title: StreetAddress
      type: object
      properties:
        address_line_1:
          type: string
          description: L'adresse postale du destinataire
        # ...
    - title: POBox
      type: object
      properties:
        box_number:
          type: string
          description: Le numéro de la boîte postale
        # ...
```

<ParamField body="delivery_address" type="object">
  <div className="mt-4 rounded-xl border border-gray-100 px-4 pb-4 pt-2 dark:border-white/10">
    <Tabs>
      <Tab title="StreetAddress">
        <ParamField body="address_line_1" type="string">
          L’adresse de la résidence
        </ParamField>
      </Tab>

      <Tab title="POBox">
        <ParamField body="box_number" type="string">
          Le numéro de la case postale
        </ParamField>
      </Tab>
    </Tabs>
  </div>
</ParamField>
