The summary.
IT CATCHES ERRORS BEFORE RUNNING, AND DOCUMENTS WHAT CODE EXPECTS
That addresses the commonest class of JavaScript bug: values being a different shape than assumed.
IT PROVIDES NO RUNTIME SAFETY
Types are removed at compilation. Data arriving from outside must still be validated, regardless of its declared type.
A declared type is an assertion, not a guarantee.
ENABLE STRICT CHECKING
Without it, many of the benefits are absent.
AVOID THE TYPE MEANING ANYTHING
It disables checking entirely, which defeats the purpose. Where the type is genuinely unknown, use the one that forces you to narrow it.
ANNOTATE FUNCTION SIGNATURES; LET INFERENCE HANDLE THE REST
Signatures are the contract, and they document intent.
ADOPT IT GRADUALLY IN AN EXISTING PROJECT
Converting everything at once produces thousands of errors and gets abandoned.
WHEN THE COMPILER OBJECTS, ESTABLISH WHY
It is usually correct. And types that are difficult to express frequently indicate a design problem.