OpenAPI 3.1.0 и пустые структуры в Go
Oct. 5, 2026Сегодня соприкоснулся с опенсорсом по рабочей задаче. В проекте контракты через TypeSpec, спека OpenAPI 3.1.0, на бэкенде Go-сервер из спеки собирает oapi-codegen. Переезжаем с OpenAPI 3.0.0 на 3.1.0 — и внезапно часть моделей превращается в пустой интерфейс: словарь в TypeSpec есть, в OpenAPI что-то есть, а нормальные Go-структуры не появляются.
Я уже написал костыль — bash-скрипт, который подменял нужные описания, чтобы эмиттер выдавал OpenAPI, привычный для нашего генератора. Тимлид завернул такое решение. Тогда я полез в issues oapi-codegen на GitHub — похожие обсуждения, но корень не там; думал, что когда-нибудь форкну и допилю генератор сам.
В репозитории эмиттера OpenAPI в TypeSpec нашёл готовый PR #11954 (автор bimsonz). При OpenAPI 3.1.0 словари вроде Record<FieldValue> в спеке уходили в unevaluatedProperties. oapi-codegen это поле не читает — на выходе map[string]interface{}, ссылка на тип значения пропадает, нужная структура даже не попадает в код. Для простых словарей в OpenAPI 3.1.0 патч снова отдаёт additionalProperties, где это безопасно. PR был заброшен. Я описал наш случай в комментарии, пинганул сопровождающего и соавтора патча. Примерно через пять часов — одобрили, поставили в очередь на слияние и влили в main.
Мне остаётся дождаться релиза пакета эмиттера и обновить зависимость у нас. По идее, diff по репозиторию будет небольшим — тогда переезд на OpenAPI 3.1.0 будет без особых проблем.