Нужно чуть больше контекста — в каком языке и окружении вы пишете (Python/JS/Rust/Go/C#, веб‑API, Telegram‑бот и т. п.) и какой у вас код. Пожалуйста, прикрепите пример кода и опишите, что именно вы хотите вернуть (текст, картинку, JSON с разными схемами, разные HTTP‑ответы и т.д.).
Ниже — краткий обзор типичных подходов с примерами, возможно один из них решит вашу задачу.
1) Унифицированная оболочка (wrapper) с полем type
- Простой и универсальный способ для HTTP/API: всегда возвращать объект вида { type: "...", payload: ... }.
- Клиент смотрит на поле type и парсит payload соответствующим образом.
Пример (JS/TS):
- { type: "text", payload: "Hello" }
- { type: "image", payload: { url: "...", alt: "..." } }
2) Дискриминируемые объединения (TypeScript) / Union типы (Python typing.Union)
- TypeScript: описываете union типов и возвращаете соответствующий вариант.
- Python (FastAPI): можно возвращать typing.Union моделей и использовать response_model или возвращать разный Response (JSONResponse, FileResponse).
Пример (TS):
type Msg = { type: "text"; text: string } | { type: "image"; url: string };
3) Enum / sum type (Rust, Swift, etc.)
- В языках с алгебраическими типами используйте enum.
Rust пример:
enum Message { Text(String), Image(String) }
Сериализация в JSON с #[serde(tag = "type", content = "data")] даст {"type":"Text","data":"..."}.
4) Интерфейсы/наследование (Java/C#/Go)
- Создаёте базовый интерфейс IMessage и разные реализации TextMessage, ImageMessage. Возвращаете базовый тип, но в рантайме указывает конкретную реализацию.
- В Go можно возвращать interface{} и делать type assertion на клиенте.
5) HTTP content negotiation / Content-Type
- Если вы хотите возвращать разные представления (JSON, HTML, файл), устанавливайте корректный Content-Type и возвращайте соответствующий Response (например, в Flask — jsonify, send_file, plain text).
6) Для ботов (Telegram/Discord)
- Не "возвращаете" разные типы, а вызываете разные отправляющие методы API: sendMessage, sendPhoto, sendDocument и т.д. Либо формируете объект с полем method/type и dispatcher его отправляет.
Если пришлёте ваш код и укажете, какие варианты сообщений нужны — напишу точный пример и покажу, как это встроить в текущую реализацию.