Design for failure. When things go wrong, you can use HTML form validation. But — as you know — never ever trust any user input, validate all data on application level. This is the same signup form in different states.
This is just one opinionated way to do this. Imagine that the form fields validate via AJAX while entering data. When everything is fine, the sign up button get’s enabled.