TypeScript обладает мощной системой вывода типов. В большинстве случаев типы переменных, параметров и возвращаемых значений вычисляются автоматически на основании контекста. Существует несколько уровней вывода типов:
Примеры:
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 автоматический вывод дал слишком общий тип, и ошибки с типами данных попали в продакшн.