ProgrammazioneFrontend разработчик / Fullstack разработчик

Как работает система автоматического вывода типов (type inference) в TypeScript? Какие бывают уровни вывода типов и какие ошибки можно допустить, рассчитывая на 'ум' компилятора?

Supera i colloqui con l'assistente IA Hintsage

Ответ

TypeScript обладает мощной системой вывода типов. В большинстве случаев типы переменных, параметров и возвращаемых значений вычисляются автоматически на основании контекста. Существует несколько уровней вывода типов:

  • Простой вывод: при объявлении переменных без явного типа
  • Контекстный вывод: когда тип выражения определяется из контекста (например, обработчик событий)
  • Best common type: для массивов с элементами разных типов — ищется наиболее общий

Примеры:

let a = 2; // number let b = [1, "a"]; // (number | string)[] window.addEventListener('click', e => { // e: MouseEvent });

Ограничение: если компилятор не может вывести тип однозначно — он выберет широчайший (обычно это any), что лишает преимуществ типизации.

Вопрос с подвохом

Типизируется ли аргумент функции, если не указать явно, но функция используется далее с типизированным значением?

Неверный ответ: Да, TypeScript всегда автоматически "догадается" о типе аргумента.

Правильный ответ: Нет. Только если контекст функции содержит информацию о типе, аргумент получит тип. В противном случае — будет any или другой базовый тип, что приведёт к ошибкам. Всегда стоит явно типизировать входные данные.

Пример:

function f(x) { return x.toFixed(2); // Ошибка: x — типа any }

Примеры реальных ошибок из-за незнания тонкостей темы


История

В проекте не указали явно тип возвращаемого значения кастомного хука React, и TypeScript не увидел, что тип может быть undefined. В результате вызов метода объекта без проверки приводил к runtime ошибкам.


История

При создании массива mixed-type значений итоговый тип автоматически вывелся как массив any[], потому что явно не был задан тип, что привело к потере всех преимуществ типизации в дальнейшем коде.


История

Валидация входных параметров сервиса была не типизирована, а рассчитывалась на "догадку" TypeScript. После рефакторинга codebase автоматический вывод дал слишком общий тип, и ошибки с типами данных попали в продакшн.