ODMA
Контракты TypeScript
Описываем допустимые состояния
Предпочитаем type, unknown, as const, дискриминируемые объединения и satisfies. Внешние данные проверяем во время выполнения существующим механизмом проекта. Приведение типа не проверяет ответ API.
type TResult<TData> =
| { ok: true, data: TData }
| { ok: false, status: number, message: string }
const render_result = (result: TResult<string>) => {
if (!result.ok) return result.message
return result.data
}
Для полноты обработки используем never, для отображений — типизированные реестры. Избегаем any, искусственных обобщений и абстракций ради красоты типов. Публичный тип принадлежит модулю, который владеет контрактом.