Есть ли типизация на фронтенде
Что проверяют
Понимаете ли вы, какая типизация у самого JavaScript и что добавляет TypeScript сверху. Главный уточняющий вопрос: что остаётся от типов TypeScript во время выполнения и как вы проверяете данные, пришедшие с бэкенда.
Как отвечать
Разложите ответ на два уровня и практику:
- JavaScript: типизация динамическая и слабая. Типы есть у значений, а не у переменных,
let x = 1; x = "a"законно. Неявные приведения дают"5" - 1 === 4и"5" + 1 === "51". В рантайме тип проверяют черезtypeof,instanceof,Array.isArray; - TypeScript: статическая структурная типизация поверх JS. Совместимость определяется формой объекта, а не именем типа. Проверка идёт при сборке (
tsc --noEmit), в браузер уходит обычный JavaScript, типы стираются полностью; - настройки:
strict: trueвключаетstrictNullChecks,noImplicitAnyи остальные проверки, без него половина пользы теряется.anyотключает проверку,unknownзаставляет сузить тип перед использованием; - граница с внешним миром: ответ
fetchTypeScript не проверит,as Userэто обещание, а не проверка. Для рантайм-валидации берут Zod, Valibot или генерируют типы из OpenAPI-схемы; - альтернативы: JSDoc-аннотации с
// @ts-checkдают проверку без перехода на.ts, Flow почти ушёл из индустрии.
Для фронтенда добавьте практику: типизированные пропсы и дженерики в React-компонентах, типизированные хуки и стор, общие типы с бэкендом. Хороший штрих: свежие версии Node.js умеют запускать .ts, просто вырезая аннотации, и это ещё раз показывает, что типы существуют только до запуска.
Где спотыкаются
Говорят, что TypeScript делает код безопасным во время выполнения. Типы стираются, и ответ сервера не той формы спокойно дойдёт до компонента.
Путают сильную и статическую типизацию. JavaScript динамический и слабый, Python динамический и сильный: это разные оси.
Глушат ошибки компилятора через any и as, а потом рассказывают про преимущества типов. На ревью это видно сразу.