TypeScript делает код надежным, но неправильное использование приводит к багам. Следуйте лучшим практикам!
1️⃣ Используйте `unknown` вместо `any`
any отключает проверку типов — это как @ts-ignore для всей переменной. Опасно!
// ❌ Плохо
function process(data: any) {
return data.someMethod(); // Никаких проверок!
}
// ✅ Хорошо
function process(data: unknown) {
if (typeof data === 'object' && data !== null) {
// Безопасная проверка перед использованием
}
}
Правило: unknown заставляет вас явно проверить тип перед использованием. Это безопаснее!
2️⃣ Избегайте объектов-оберток непримитивов
// ❌ Плохо
let str: String = new String("hello");
let num: Number = new Number(42);
let bool: Boolean = new Boolean(true);
// ✅ Хорошо
let str: string = "hello";
let num: number = 42;
let bool: boolean = true;
Используйте примитивные типы: string, number, boolean, bigint, symbol.
3️⃣ Применяйте константные перечисления
Обычные enum генерируют дополнительный код во время выполнения.
const enum встраивает значения напрямую!// ❌ Генерирует runtime код
enum Status {
Active = "ACTIVE",
Inactive = "INACTIVE"
}
// ✅ Встраивается при компиляции
const enum Status {
Active = "ACTIVE",
Inactive = "INACTIVE"
}
Результат: Меньше кода, быстрее выполнение!
4️⃣ Используйте современные возможности JavaScript
TypeScript поддерживает опциональную цепочку (
?.) и нулевое слияние (??):// ❌ Старый способ
const name = user && user.profile && user.profile.name || 'Guest';
// ✅ Современный способ
const name = user?.profile?.name ?? 'Guest';
Преимущества:
🔸 Код короче и читабельнее
🔸 Меньше вероятность ошибок
🔸 Явная обработка null/undefined
5️⃣ Комбинируйте встроенные utility types
TypeScript предоставляет мощные инструменты для преобразования типов:
interface User {
id: number;
name: string;
email: string;
password: string;
}
// Все поля опциональны
type PartialUser = Partial<User>;
// Все поля только для чтения
type ReadonlyUser = Readonly<User>;
// Выбрать определенные поля
type PublicUser = Pick<User, 'id' | 'name' | 'email'>;
// Исключить определенные поля
type UserWithoutPassword = Omit<User, 'password'>;
// Сделать определенные поля обязательными
type RequiredName = Required<Pick<User, 'name'>>;Комбинируйте их:
type SafeUser = Readonly<Omit<User, 'password'>>;
Итог ⬇️
TypeScript — мощный инструмент, но важно использовать его правильно:
✅ unknown безопаснее any
✅ Примитивные типы вместо оберток
✅ const enum для производительности
✅ Современный синтаксис JS
✅ Utility types для гибкости
Следуя этим рекомендациям, вы пишете не просто типизированный код, а надежный и поддерживаемый TypeScript!
📎 Статья
🎙 Новости
📝 База вопросов
