(It doesn't even need to be a very good or strongly-enforced type system - Go makes it dangerously easy to convert between `[]byte` and `string` by other-type-system standards, and yet everything works pretty well. It's enough to hitch your thinking and make you realize you need another step.)
It's about the runtime error handling making it mandatory to deal with the error and won't let you panic at run time for this specific error.
It's not the type system, but many dynamic languages are interpreted instead of compiled.
This is quite literally the job of a type system: to impose a semantic interpretation on sequences of "raw bits" and let you specify legal (and only legal) operations in terms of the semantic interpretation rather than the bits.
That is so far from the truth.