API が複数のデータ形式を受け付けたり、条件付きフィールドを持っていたり、継承パターンを用いている場合、OpenAPI のスキーマ合成キーワードは、こうした柔軟な構造の記述に役立ちます。oneOfanyOfallOf を使えば、異なる入力タイプに対応する API や、複数のスキーマを組み合わせて包括的なデータモデルを構築する API を表現できます。

oneOf, anyOf, allOf キーワード

複雑なデータ型に対して、OpenAPI ではスキーマを組み合わせるためのキーワードが用意されています:
  • allOf: 複数のスキーマを結合します(オブジェクトのマージやベーススキーマの拡張など)。and 演算子のように機能します。
  • anyOf: 提供されたスキーマのいずれかに合致するデータを受け入れます。or 演算子のように機能します。
  • oneOf: 提供されたスキーマのうちちょうど1つに合致するデータを受け入れます。exclusive-or 演算子のように機能します。
Mintlify では、実務上の違いが API の利用に影響することはまれなため、oneOfanyOf を同等に扱います。
これらのキーワードの詳細な仕様は、OpenAPI ドキュメントを参照してください。
not キーワードは現在サポートされていません。

allOf を使ったスキーマの結合

allOf を使用すると、Mintlify は複雑な組み合わせを読みやすく表示するために OpenAPI ドキュメントに対して前処理を行います。たとえば、2つのオブジェクトスキーマを allOf で結合すると、Mintlify は両方のプロパティを1つのオブジェクトにまとめます。これは、OpenAPI の再利用可能なcomponentsを活用する際に特に有用です。
org_with_users:
  allOf:
    - $ref: '#/components/schemas/Org'
    - type: object
      properties:
        users:
          type: array
          description: 組織内のすべてのユーザーを含む配列
# ...
components:
  schemas:
    Org:
      type: object
      properties:
        id:
          type: string
          description: 組織の ID
org_with_users
object

oneOfanyOf で選択肢を提供する

oneOf または anyOf を使用すると、選択肢はタブ付きコンテナで表示されます。各サブスキーマに title フィールドを指定して、選択肢に名前を付けてください。たとえば、次のように2種類の配送先住所を表示できます。
delivery_address:
  oneOf:
    - title: StreetAddress
      type: object
      properties:
        address_line_1:
          type: string
          description: 受取人の住所(番地)
        # ...
    - title: POBox
      type: object
      properties:
        box_number:
          type: string
          description: 私書箱の番号
        # ...
delivery_address
object
address_line_1
string
居住先の住所(番地)