Функции
У любой функции с типизированными параметрами или возвращаемым типом происходит то же, что и на границе, — без единой написанной вами проверки:
function processUser(user: User): UserResult {
return computeSomething(user)
}
на сборке становится:
function processUser(user): UserResult {
user = check(user, /* схема User */)
return check(computeSomething(user), /* схема UserResult */)
}
Кривой payload падает в точке вызова — до того, как computeSomething успел
сработать. Кривая реализация, возвращающая не то, падает до того, как значение
уйдёт из функции.
Деструктурированные параметры пропускаются. Параметр вида
{ id, name }: Userуже разобран на части — переприсвоить единое значение негде, поэтому t12n его не трогает. Принимайте значение целиком (user: User) и деструктурируйте внутри тела, либо пометьтеCheck<User>, чтобы получить уведомление о пропуске.
В прод-сборке каждая такая проверка — это компилируемый валидатор, а не интерпретируемая схема, так что гарантия практически бесплатна.