Ответ
- Использование
any– убивает типизацию, теряем все преимущества TS.
function processData(data: any) { ... } // ❌
-
Избыточные нестрогие интерфейсы –
interface User { [key: string]: any }делает типы бессмысленными. Лучше явно описать структуру. -
Чрезмерные опциональные поля (
?):
interface Config { url?: string; timeout?: number } // ❌ Сложно отследить обязательность
-
Неиспользование Utility-типов – дублирование кода вместо
Partial,Pick,Omit. -
Типизация
asбез валидации – риск runtime-ошибок:
const user = {} as User; // ❌
-
Пустые интерфейсы (
interface Empty {}) – бесполезны, лучше использоватьtypeилиunknown. -
Игнорирование
strictрежима – приводит к неявным ошибкам. Всегда включатьstrict: trueвtsconfig.json. -
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 посреди ночи на проде. В рот меня чих-пых, просто жуть.