Где и как прописать аннотацию типа в TypeScript
Что проверяют
Знаете ли вы синтаксис и, главное, понимаете ли, где аннотация нужна, а где TypeScript выведет тип сам. Следом обычно спрашивают про разницу между аннотацией, as и satisfies или просят типизировать пропсы и хук в React.
Как отвечать
Синтаксис один: двоеточие и тип после имени. Где он встречается:
- переменные:
let count: number. Нужна, когда значения ещё нет или оно шире начального:const items: Item[] = []; - параметры функций: почти всегда, вывода по использованию у них нет. Исключение: колбэки вроде
arr.map(x => ...), где тип приходит из контекста; - возвращаемый тип:
function load(): Promise<User>. У экспортируемых функций полезен явно, чтобы ошибка внутри тихо не меняла публичный контракт; - пропсы и дженерики:
({ title, onClose }: ModalProps),useState<User | null>(null),useRef<HTMLInputElement>(null); - обработчики событий:
(e: React.ChangeEvent<HTMLInputElement>) => ....
Проговорите правило: аннотируйте границы (параметры, экспорт, пропсы, ответ API), а внутри функций доверяйте выводу. Строка const total: number = a + b ничего не добавляет.
Затем разведите три похожие конструкции. Аннотация проверяет значение и задаёт переменной объявленный тип. as это утверждение: компилятор верит на слово, поэтому {} as User пройдёт без ошибки. satisfies проверяет соответствие типу, но сохраняет выведенный, более узкий: const routes = {...} satisfies Record<string, Route> оставляет автодополнение по конкретным ключам.
Упомяните strict в tsconfig.json: без noImplicitAny параметр без аннотации молча становится any.
Где спотыкаются
Аннотируют всё подряд. Кроме шума, const mode: string = "dark" расширяет литерал до string, и точный тип теряется.
Пишут as там, где нужна аннотация, особенно с ответом fetch. Несовпадение формы данных уезжает в рантайм.
Путают unknown и any. unknown заставляет сузить тип проверкой перед использованием, any отключает проверки совсем.