Doesn't need type annotations. Annotate as much or as little as you'd like. The types are inferred by the language (and, again, are guaranteed correct)
How is this achieved? E.g. you npm install module ‘foo’ which has no types and takes no part in a rescript compilation process. Does it force you to type-narrow all the values returned from foo.funcname()?