> ## 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.

# Tipos de datos complejos

> Describe APIs con esquemas flexibles, propiedades opcionales y múltiples formatos de datos con las palabras clave `oneOf`, `anyOf` y `allOf`.

Cuando tu API acepta varios formatos de datos, tiene campos condicionales o utiliza patrones de herencia, las palabras clave de composición de esquemas de OpenAPI te ayudan a documentar estas estructuras flexibles. Con `oneOf`, `anyOf` y `allOf`, puedes describir APIs que admiten diferentes tipos de entrada o combinan múltiples esquemas en modelos de datos completos.

<div id="oneof-anyof-allof-keywords">
  ## Palabras clave `oneOf`, `anyOf`, `allOf`
</div>

Para tipos de datos complejos, OpenAPI proporciona palabras clave para combinar esquemas:

* `allOf`: Combina varios esquemas (como fusionar objetos o extender un esquema base). Funciona como un operador `and`.
* `anyOf`: Acepta datos que coincidan con cualquiera de los esquemas proporcionados. Funciona como un operador `or`.
* `oneOf`: Acepta datos que coincidan exactamente con uno de los esquemas proporcionados. Funciona como un operador `exclusive-or`.

<Warning>Mintlify trata `oneOf` y `anyOf` de forma idéntica, ya que la diferencia práctica rara vez afecta el uso de la API.</Warning>

Para obtener especificaciones detalladas de estas palabras clave, consulta la [documentación de OpenAPI](https://swagger.io/docs/specification/data-models/oneof-anyof-allof-not/).

<Info>La palabra clave `not` no es compatible actualmente.</Info>

<div id="combining-schemas-with-allof">
  ### Combinando esquemas con `allOf`
</div>

Cuando usas `allOf`, Mintlify realiza un preprocesamiento de tu documento de OpenAPI para mostrar combinaciones complejas de forma legible. Por ejemplo, cuando combinas dos esquemas de objeto con `allOf`, Mintlify unifica las propiedades de ambos en un solo objeto. Esto resulta especialmente útil al aprovechar los [componentes](https://swagger.io/docs/specification/components/) reutilizables de OpenAPI.

```yaml theme={null}
org_with_users:
  allOf:
    - $ref: '#/components/schemas/Org'
    - type: object
      properties:
        users:
          type: array
          description: Una matriz que contiene todos los usuarios de la organización
# ...
components:
  schemas:
    Org:
      type: object
      properties:
        id:
          type: string
          description: El ID de la organización
```

<ParamField body="org_with_users" type="object">
  <Expandable>
    <ParamField body="id" type="string">
      El ID de la organización
    </ParamField>

    <ParamField body="users" type="object[]">
      Una matriz que contiene a todos los usuarios de la organización
    </ParamField>
  </Expandable>
</ParamField>

<div id="providing-options-with-oneof-and-anyof">
  ### Proporcionar opciones con `oneOf` y `anyOf`
</div>

Cuando uses `oneOf` o `anyOf`, las opciones se muestran en un contenedor con pestañas. Especifica un campo `title` en cada subschema para poner nombre a tus opciones. Por ejemplo, así podrías mostrar dos tipos distintos de direcciones de entrega:

```yaml theme={null}
delivery_address:
  oneOf:
    - title: StreetAddress
      type: object
      properties:
        address_line_1:
          type: string
          description: La dirección postal del destinatario
        # ...
    - title: POBox
      type: object
      properties:
        box_number:
          type: string
          description: El número del apartado de correos
        # ...
```

<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">
          La dirección de la residencia
        </ParamField>
      </Tab>

      <Tab title="POBox">
        <ParamField body="box_number" type="string">
          El número del apartado postal
        </ParamField>
      </Tab>
    </Tabs>
  </div>
</ParamField>
