Видеоуроки, интерактивный редактор и сохранение прогресса — бесплатно, сразу после входа.
ВойтиСоздать аккаунт — бесплатноЗакончили урок?
Войдите, чтобы отмечать прогресс
Для (a: number, b: number) => a + b выводится A = [a: number, b: number] и R = number. Обёртка получает тип (a: number, b: number) => number: сохранились даже имена параметров, и редактор покажет их в подсказке.
Ограничение обязательно: rest-параметр должен быть массивом или кортежем. Без extends unknown[] компилятор скажет «A rest parameter must be of an array type». Вывод при этом даёт не просто массив, а кортеж с точным числом и типами позиций.
Восклицательный знак после имени называется definite assignment assertion: «эта переменная будет заполнена до чтения, я за это отвечаю».
Конкретно здесь компилятор промолчал бы и без него: result читается во вложенной функции, а внутри замыканий TypeScript не отслеживает, присвоена ли переменная. Но если бы чтение было в том же теле, без ! появилась бы ошибка «Variable 'result' is used before being assigned». ! явно помечает место, где мы знаем больше компилятора: при первом вызове result обязательно заполнится, а до первого вызова его никто не читает.
Альтернатива let result: R | undefined с return result as R делает то же самое, только длиннее.
В стандартной библиотеке есть типы, которые достают эти части из готовой функции:
Они пригодятся, когда тип функции уже есть и нужно разобрать его на части. Как устроен ReturnType, разберём в задании 22.