Define H1-H6 and body copy first. As needed, create text styles for buttons, links, labels, etc. Then, apply color/text decoration/letter spacing etc. to text and links as needed to convey functionality or a certain purpose.
To set up your type sizes and hierarchy, you can get started with a type scale tool like modularscale.com or type-scale.com.
Limit the use of font variations such as bold, italics, and ALL CAPS. Using all caps is harder to read, and feels like you’re shouting! It should only be used for short text that doesn’t involve much reading, such as links or labels.
Use a large enough font size for body text so that people can comfortably read.
Body copy should be at least 16px, 18-21px is even better.
A larger font size enhances the reading experience for everyone, not just those with visual impairments.
Headings tend to be larger and bolder than other elements to stand out. Make sure your header size and body copy size are distinctly different from eachother, and when in doubt, increase the size of your headers to be safe.
Avoid using fonts that are too thin (like 100 and 200 weights) when you can, especially for smaller text sizes.
A good way to think about type hierarchy is: what needs to stand out most on the page?
When it comes to pairing typefaces, using a sans serif for headers and serif for body copy is usually a safe bet. Avoid pair fonts that are too similar, e.g. using a slab serif for both headers and paragraph text, or pairing two serifs. Don’t use display typefaces with too much personality for body copy. Typefaces with a lot of personality are often meant to be used at large sizes only, such as for headings.
Use a neutral, legible typeface is best for paragraph text. Serifs are usually the best choice when designing text-heavy experiences, such as a blog.
As a general rule, you should trust the typeface designer and leave letterspacing alone. There are some cases where it’s necessary, e.g. adding a little letterspacing to small or all caps text to help legibility.
Every typeface should have a purpose — you should define their specific roles up front and stick to them, resuing styles for text that has the same functionality.