Какие знаешь плохие паттерны в TypeScript

Ответ

  1. Использование any – убивает типизацию, теряем все преимущества TS.
    function processData(data: any) { ... } // ❌
  1. Избыточные нестрогие интерфейсыinterface User { [key: string]: any } делает типы бессмысленными. Лучше явно описать структуру.

  2. Чрезмерные опциональные поля (?):

    interface Config { url?: string; timeout?: number } // ❌ Сложно отследить обязательность
  1. Неиспользование Utility-типов – дублирование кода вместо Partial, Pick, Omit.

  2. Типизация as без валидации – риск runtime-ошибок:

    const user = {} as User; // ❌
  1. Пустые интерфейсы (interface Empty {}) – бесполезны, лучше использовать type или unknown.

  2. Игнорирование strict режима – приводит к неявным ошибкам. Всегда включать strict: true в tsconfig.json.

  3. Over-engineering с дженериками – излишняя сложность там, где можно обойтись простыми типами.

Лучше следовать принципу: "Пиши типы так, чтобы ошибки обнаруживались на этапе компиляции".

Ответ 18+ 🔞

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

Первое, блядь, святотатство — это any. Ну серьёзно, зачем ты тогда TypeScript ставил, если пишешь как в обычном JS? Это же пиздец полный, откат в каменный век.

function processData(data: any) { ... } // ❌ Ну вот зачем? Зачем? Ты же всё похерил!

Ты просто берёшь и выключаешь всю типизацию, как будто её и не было. Волшебная палочка-ебалка. Хочешь ошибку в рантайме? Вот тебе прямая дорога.

Второе — эти интерфейсы-простыни, где всё можно. [key: string]: any — это не интерфейс, это крик души разработчика, который сдался. "А похуй, пусть там что угодно будет". Так не работает, дружок! Типы должны помогать, а не создавать иллюзию помощи.

Третья беда — знак вопроса на каждом углу. interface Config { url?: string; timeout?: number }. С одной стороны, гибко. С другой — хуй пойми, что там на самом деле нужно, а что нет. Получается месиво из "может быть, а может и нет". Подозрение ебать чувствую к таким конструкциям.

Четвёртое — упоротое нежелание использовать встроенные утилиты. Зачем городить свой велосипед, если есть Partial, Pick? Люди же придумали их не просто так, чтобы ты их игнорировал, полупидор. Дублирование кода — это грех.

Пятое, самое опасное — это as без задней мысли.

const user = {} as User; // ❌

"Я сказал, что это User, значит, это User!" — говорит такой код. А на деле там пустой объект, и всё сломается в самый неподходящий момент. Это не типизация, это самообман на уровне "и так сойдёт".

Шестое — интерфейсы-пустышки. interface Empty {}. Ну и нахуя? Чтобы место в коде занимать? Используй type или unknown, не позорься.

Седьмое — трусость. Не включать strict: true в tsconfig.json — это как ехать на машине с неработающими тормозами и говорить "да я аккуратно". Рано или поздно въебешься, и будет больно. Включай строгий режим и не ной.

И восьмое, моё любимое — переусложнённые дженерики. Когда человек такой умный, что начинает делать абстракцию на ровном месте, и в итоге получается трёхэтажная хуйня, которую не разобрать ни тебе, ни компуктеру. Over-engineering в чистом виде. Не надо так.

Запомни, чувак, главный принцип: пиши типы так, чтобы компилятор ловил твои косяки ДО того, как их увидит пользователь. Всё остальное — от лукавого, и ведёт прямиком в ад с undefined is not a function посреди ночи на проде. В рот меня чих-пых, просто жуть.