Just like in normal programming, descriptive names are king. You should be able to tell what a specific test tests by just looking at it’s name.
This talk by Kevlin Henney on the structure and interpretation of test cases give a good explanation on how to name test cases.
His examples in the talk are not in TypeScript but they can be easily translated.
Small Tests
Each test should only test one thing. This does not mean that a test must only have one expect.
A test should do something to the subject being tested and then check that the state of the subject is what you expect with one or more expect calls.
Code Coverage
While code coverage can be a useful metric, you have to be aware that it simply means there is a test that runs this piece of code, but that does not say anything about the quality of the test.
That being said, I find coverage reports quite useful to find functions that I forgot to test.
Example
Say for example you want to test a time parser for the format HH:MM where HH is the two digit hour and MM is the two digit minute.
If the parser succeeds it returns an object with getHour() and getMinute() which return numbers, and it fails it returns undefined.
A good test structure might look like this.
This gives a nice and readable test output, where it is immediately apparent what is being tested.