I kindof think of them as a giant set of unit tests. The compiler/linter etc. can check every variable and every function call to check to make sure you didn't mix up your types, which _will_ blow up at runtime if you got them wrong.
So rather than write them all by hand, just get your tools to do it.
I see them as documentation of what I think something means or is, which the computer can check for accuracy (more or less), both as I write and as the codebase changes.
That legibility to the computer is what makes them much better than documenting the same thing some other way. Are they out of date? Were they wrong to begin with? The computer will tell me, no action needed on my part. I need to look up something in the context of what I'm reading right now—oh, look, the computer just told me exactly what I needed.
So rather than write them all by hand, just get your tools to do it.