> ## Documentation Index
> Fetch the complete documentation index at: https://adminroletesting-justin-client-exports.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Tipos de datos complejos

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

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="any-and-undefined-types">
  ### Tipos `any` y `undefined`
</div>

Los campos tipados como `any` o `undefined` se muestran de la misma manera que los esquemas `oneOf`, con un selector que permite a las personas elegir una forma concreta antes de enviar una solicitud. Esto permite que el playground de la API presente una entrada significativa incluso cuando el esquema no restringe el valor a un único tipo.

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

Cuando uses `oneOf` o `anyOf`, las opciones aparecen 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>
