TypeScript создан с акцентом на безопасную разработку без избытка явных типов: большинство типов переменных, параметров, возвращаемых значений компилятор умеет автоматически выводить. Система вывода типов (type inference) позволяет писать код почти как на JavaScript, но с сохранением строгой типизации, что значительно ускоряет разработку и снижает количество ошибок.
Type inference не всегда гарантированно выводит тот тип, который ожидает разработчик. Складываются ситуации, когда тип получается слишком широким (any или unknown), либо наоборот — чрезмерно строгим. Это приводит либо к лишним ограничениям, либо к отсутствию проверки типов, что в обоих случаях небезопасно.
TypeScript автоматически выводит тип на основании присваивания или из возвращаемого значения функции, если тип явно не задан. Управлять выводом можно с помощью явного указания типа, type assertion, generics и специальных утилит (ReturnType, Parameters и др.). Работа со сложными структурами требует особого контроля: если тип сложный или неочевидный, лучше указать его явно.
Пример кода:
let a = 5; // number (выведет автоматически) function sum(x = 4, y = 3) { // x: number, y: number return x + y; // return: number } // Ошибка вывода типаunction getData(flag) { if (flag) return 123; // нет return в другом ветвлении — return type: number | undefined } // Лучше явно: function getData(flag: boolean): number | undefined { if (flag) return 123; }
Ключевые особенности:
True/False: Type inference всегда даёт тот тип, что ожидает разработчик
False. Иногда тип шире или уже, особенно для массивов/объектов/union возвращаемых значений (number | undefined — частая неожиданность).
Если в объекте не указывать тип, TypeScript всегда сохранит точную структуру
Нет, без as const структура будет "расширяемой" (widened), с as const будет readonly с литеральными типами.
const obj = { kind: "duck" }; // obj: { kind: string } const obj2 = { kind: "duck" } as const; // obj2: { readonly kind: "duck" }
Если не указывать тип для массива, TS всегда знает его состав
Нет, по умолчанию TypeScript делает массив максимально "широким" — например, let arr = [1, 'a'] будет (string | number)[], а не tuple.
Backend выдаёт объект ответа { data: [] }, тип явно не указан, TypeScript выводит тип data: any[]. В какой-то момент data становится массивом строк — ошибка всплывает только на проде.
Плюсы:
Минусы:
В проекте принято всегда явно указывать тип возвращаемых значений функций и сложных структур, использовать as const для констант. Любое изменение структуры проверяется компилятором.
Плюсы:
Минусы: