Какие конструкции не нужно использовать в TypeScript

Ответ

  1. any — отключает проверку типов, теряя преимущества TS. Используй unknown или конкретные типы.
  2. Неявные any — включай noImplicitAny в tsconfig, чтобы избежать неявного any.
  3. as (утверждение типов) — может скрывать ошибки. Лучше использовать сужение типов или guards.
  4. enum — могут быть избыточны. Альтернативы: union-типы (type Status = 'active' | 'inactive') или const-объекты.
  5. Неиспользуемые дженерики — если тип не используется, замени на конкретный или удали.
  6. Опциональные цепочки (?.) без необходимости — могут маскировать проблемы. Проверяй данные явно.

Пример плохого кода:

function getValue(data: any): string {
  return data?.value as string; // ❌ any + as + ?.
}

Лучше:

function getValue(data: { value?: string }): string | undefined {
  return data.value; // ✅ явная типизация
}

Ответ 18+ 🔞

А, слушай, смотри-ка, какие тут типичные грабли в TypeScript поджидают, прямо как собака Муму под крыльцом, блядь. Народ на них наступает, а потом орет, что TS — говно. А это ты, дружок, просто еблан.

Вот, например, any. Это же просто белый флаг, капитуляция, блядь. Написал any — и всё, можно хоть хуй в пальто передавать, компилятор проглотит. Зачем тогда TS, если ты им как Герасим — немой? Вместо этого есть unknown или, на хуй, нормальные типы напиши.

Дальше — неявные any. Это когда ты такой: "ой, компилятор, сам догадайся, че я тут хочу". Включи в tsconfig опцию noImplicitAny, и он тебе сразу: "Э, сабака, сука, э бошка думай!". Заставит объявлять типы явно.

А вот это as — утверждение типов. Ну прям как Герасим с Муму: "Я сказал — это строка, значит строка, блядь, хоть ты тресни!". Можешь так ошибиться, что потом полдня искать, где ж тебя заложили. Лучше сужение типов через typeof, instanceof или type guards.

enum — о, ёпта, отдельная песня. Часто они как мартышлюшка — суетливые и не всегда нужные. Для простых наборов значений хватит union-типа: type Status = 'active' | 'inactive'. Или const-объекта. Проще, понятнее, и в рантайме не выебываются.

Неиспользуемые дженерики — это вообще пиздец. Объявил <T>, а T нихуя не делаешь. Зачем? Просто для красоты? Удали или замени на конкретный тип, не мусорь.

И последнее — опциональные цепочки (?.). Инструмент-то хороший, но им как дубинкой: можно и по голове себе дать. Ставишь везде, где ни попадя, маскируешь реальные проблемы с данными, а потом в продакшене — удивление пиздец, откуда undefined вылез. Проверяй данные явно, когда это важно.

Смотри, вот тебе пример, как делать не надо, прям как в той сказке — всё через жопу:

function getValue(data: any): string {
  return data?.value as string; // ❌ Три греха разом: any, ?., as. Пизда рулю.
}

А вот как надо, по-человечьи:

function getValue(data: { value?: string }): string | undefined {
  return data.value; // ✅ Всё честно, тип ясен, варианты понятны.
}

Вот и вся философия. Не будь мудаком, как тот барин, который велел Муму утопить. Думай, что пишешь, и TS ответит тебе взаимностью, а не ошибками в 3 часа ночи.