TypeScript спас мой проект: строгая типизация на практике
Включить "strict": true в проекте с трёхлетней историей — всё равно что признаться коду во всех грехах сразу: 4 812 ошибок в первой же сборке.
Мы не стали геройствовать. План был такой: новые файлы пишем строго, старые чиним по касанию, а any помечаем комментарием-долгом с тикетом. Каждую неделю — час «типизационной пятницы».
type Result<T, E = Error> =
| { ok: true; value: T }
| { ok: false; error: E };
async function loadOrder(id: string): Promise<Result<Order>> {
// никаких исключений-сюрпризов для вызывающего кода
}
Отдельное удовольствие — discriminated unions для состояний UI. Когда «загрузка», «успех» и «ошибка» выражены типами, невозможно отрендерить спиннер с данными одновременно.
За восемь месяцев количество прод-багов, связанных с undefined и опечатками в полях, упало примерно вдвое. Типы — это тесты, которые пишутся сами, пока вы пишете код.
any — это кредит под очень высокий процент: берёшь минуту спокойствия сейчас, отдаёшь ночью в день релиза.
Комментарии 1
«Типизационная пятница» — украду идею. У нас похожее называлось «час долгов», и туда никто не ходил, пока не начали показывать график закрытых any.