Type checking, or static analysis in general, checks for the presence of a particular class of errors.
Unit tests check for correct behaviour, and in doing so imply a lack of any errors, types or otherwise.
While it can be good to use unit tests to check for regressions in a specific error, the core of your tests should be specifying the behaviour of your system, not trying to catch out any specific class of errors.
If your tests are busy looking for specific errors, there will always be some that you miss (type checking, even in Haskell, misses a lot of classes of error). If your tests check for correct behaviour, there can be no errors.
Of course, writing tests with perfect coverage and specifying all the behaviour is impossible, even more so when you've got actual features to get out the door. So any static analysis you're comfortable with can be great for making up some of the slack, but let's not pretend that in most cases we shouldn't now need to be writing those tests to check it does what it's meant to.
The place where this approach sometimes falls short is on the public API boundary, as I mentioned in my other post. Types can be useful there, so maybe my original assertion was a little too strong, but still types should very rarely mean less tests.
(Apologies if the post is a bit all over the place, redrafting on a phone is hard)
type annotation tests that at compile time
There might be some worth in checking the structure of an object (including attached functions) as it leaves a public api, especially in a language like Javascript that plays it so fast and loose with object construction.
That's one of the nice thing about typescript - you can use it where it's most helpful and leave it where it's not.
especially for testing return types as C for example you assign those.
In C it's more popular to write example code which uses the library, and the errors are spotted at compile time.