Функции

У любой функции с типизированными параметрами или возвращаемым типом происходит то же, что и на границе, — без единой написанной вами проверки:

function processUser(user: User): UserResult {
  return computeSomething(user)
}

на сборке становится:

function processUser(user): UserResult {
  user = check(user, /* схема User */)
  return check(computeSomething(user), /* схема UserResult */)
}

Кривой payload падает в точке вызова — до того, как computeSomething успел сработать. Кривая реализация, возвращающая не то, падает до того, как значение уйдёт из функции.

В прод-сборке каждая такая проверка — это компилируемый валидатор, а не интерпретируемая схема, так что гарантия практически бесплатна.