Ответ
- Использование
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 с дженериками – излишняя сложность там, где можно обойтись простыми типами.
Лучше следовать принципу: "Пиши типы так, чтобы ошибки обнаруживались на этапе компиляции".