This idea was popularized in this article, Parse, don’t validate.
The idea is to capture as much information in the type system as possible so that the program doesn’t have to deal with invalid / undefined states everywhere, but at its boundaries. For example, a NonEmpty list enforces this invariant on the list.
Some other articles with the same ideas: