If you use a language with type inference, you won't see what it returns either. Because it is not in the code. You would need an IDE which finds it out.
Sometimes it computes a type and you have no idea what the type is about.
Also dynamic typing does not mean you don't know what a function receives or returns. Many dynamically typed languages are object oriented and use classes.
With inferred types you still know that callers must be passing something for which the operations performed are valid.
Many languages allow you to specify types even when they may be inferred to add clarity/preconditions. This is useful for modelling the domain as well as local reasoning. Perhaps the current implementation is valid for all integers, but in the domain context it only makes sense for the range 0-100.
Sometimes it computes a type and you have no idea what the type is about.
Also dynamic typing does not mean you don't know what a function receives or returns. Many dynamically typed languages are object oriented and use classes.
For example in Lisp I would write:
Then I know that the arguments are objects of class ship and submarine and it returns an collision-event.It's not statically typed, but the code is nicely readable and testable.