Топ ошибок начинающих TypeScript разработчиков: как писать чистый и безопасный код
TypeScript — это мощный инструмент, который помогает разработчикам писать более предсказуемый и безопасный JavaScript-код. Однако, переходя с JS, многие новички совершают одни и те же ошибки, сводя на нет преимущества строгой типизации. В этой статье мы разберем 4 самые распространенные ошибки начинающих TypeScript разработчиков и покажем, как их исправить с помощью наглядных примеров.
1. Злоупотребление типом any
Самая частая и опасная ошибка — использование any везде, где TypeScript просит указать тип. Это превращает ваш код обратно в обычный JavaScript, лишая вас подсказок редактора и проверки типов во время компиляции.
❌ Плохой пример:
function processData(data: any) {
return data.name.toUpperCase();
}
const result = processData(42); // Ошибка в рантайме! У числа нет свойства name
✅ Хороший пример:
interface UserData {
name: string;
age: number;
}
function processData(data: UserData): string {
return data.name.toUpperCase();
}
const user: UserData = { name: "Иван", age: 30 };
const result = processData(user); // Работает корректно
Совет: Старайтесь использовать unknown вместо any, если тип действительно неизвестен. unknown заставит вас провести проверку типа перед использованием значения.
2. Игнорирование Strict Mode
Многие начинающие разработчики отключают строгий режим (strict: true) в tsconfig.json, чтобы "не отвлекаться на ошибки". Это лишает вас главного преимущества TypeScript — раннего обнаружения потенциальных багов.
Что включает Strict Mode:
strictNullChecks— запрещает присваиватьnullиundefinedпеременным, если это не указано явно.noImplicitAny— запрещает неявное использованиеany.strictFunctionTypes— более строгая проверка типов функций.
❌ Без Strict Mode:
function getLength(value: string | null) {
return value.length; // Ошибка в рантайме, если value = null
}
✅ Со Strict Mode:
function getLength(value: string | null): number {
if (value === null) {
return 0; // Обрабатываем null явно
}
return value.length; // TypeScript знает, что value — это string
}
Совет: Всегда включайте "strict": true в tsconfig.json. Это сэкономит часы отладки в будущем.
3. Неправильная работа с асинхронностью
Ошибки с промисами и async/await — классика. Начинающие часто забывают обрабатывать ошибки или неправильно типизируют асинхронные функции.
❌ Плохой пример:
async function fetchData(url: string) {
const response = await fetch(url);
const data = response.json(); // Забыли await!
return data;
}
✅ Хороший пример:
interface ApiResponse {
id: number;
title: string;
}
async function fetchData(url: string): Promise<ApiResponse> {
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data: ApiResponse = await response.json();
return data;
} catch (error) {
console.error("Ошибка при загрузке данных:", error);
throw error; // Пробрасываем ошибку дальше
}
}
Совет: Всегда используйте try...catch для обработки ошибок в асинхронных функциях и не забывайте про await при вызове методов, возвращающих промис.
4. Игнорирование типов для внешних библиотек
Многие новички подключают популярные библиотеки (lodash, axios, moment), но не устанавливают для них пакеты типов. В результате TypeScript не знает, какие типы возвращают функции, и вы снова скатываетесь к any.
❌ Плохой пример:
import _ from 'lodash'; // Ошибка: не удается найти модуль 'lodash' или его объявления типов
const result = _.chunk([1, 2, 3, 4], 2); // result: any
✅ Хороший пример:
npm install --save-dev @types/lodash
import _ from 'lodash';
const result: number[][] = _.chunk([1, 2, 3, 4], 2); // result: number[][]
Совет: Для большинства популярных библиотек существуют пакеты @types/имя_библиотеки. Устанавливайте их как dev-зависимости. Если для библиотеки нет типов, создайте файл declarations.d.ts и объявите типы вручную:
declare module 'my-custom-lib' {
export function doSomething(value: string): number;
}
Заключение
TypeScript — это не просто "JavaScript с типами". Это инструмент, который помогает вам писать код, который легче читать, поддерживать и отлаживать. Избегая четырех перечисленных выше ошибок, вы сможете раскрыть весь потенциал TypeScript и сделать свой код более надежным.
Краткий чек-лист для начинающего TypeScript разработчика:
- ✅ Никогда не используйте
anyбез крайней необходимости. Заменяйте его наunknownили конкретные интерфейсы. - ✅ Включайте
"strict": trueвtsconfig.json. - ✅ Всегда обрабатывайте ошибки в асинхронном коде.
- ✅ Устанавливайте типы для всех внешних библиотек.
Помните: чем раньше вы научитесь правильно работать с TypeScript, тем быстрее вы станете профессиональным разработчиком. Удачи в изучении!