Как ловить разницу между моделями при общении клиент =&gt; сервер?
interface RequestModel<T> extends Request {
  body: T
}

class UserRegisterModel {
  first_name: string;
  last_name: string;
  email: string;
  password: string;

  constructor({first_name}) {
    this.first_name = firstname;
    // И так все НУЖНЫЕ поля
  }
}

app.post('/register', async (req: RequestModel<UserRegisterModel>, res) => {
  if(req.body) {
    const user = new UserRegisterModel(req.body);
    // Хоба и лишних полей нет ))
}
});
Никак, в рантайме нет никаких типов и TS.
Нормально валидируйте пришедшие данные, берите только нужные поля или жестко проверяйте структуру.
Сохранять любой мусор, что дает клиент глупо.