TypeScript offers full support for the class keyword introduced in ES2015. As with other JavaScript language features, TypeScript adds type annotations and other syntax to allow you to express relationships between classes and other types.
Here is a list of features:
- --strictPropertyInitialization: The strictPropertyInitialization setting controls whether class fields need to be initialized in the constructor.
 - readonly: Fields may be prefixed with the readonly modifier. This prevents assignments to the field outside of the constructor.
 - super: makes sure if super is called in constructor of the class implementing base class
 - getter nad setter: If get exists but no set, the property is automatically readonly
 - getter and setter: If the type of the setter parameter is not specified, it is inferred from the return type of the getter
 - Since TypeScript 4.3, it is possible to have accessors with different types for getting and setting.
 - implements clause to check that a class satisfies a particular interface.
 - Type-only Field Declarations: use declare keyword to narrow down type of  an inherited field to more accurate
 - Member Visibility modifiers: public, protected, private
 - Classes can use generic constraints and defaults the same way as interfaces.
 - An abstract method or abstract field is one that hasn’t had an implementation provided. These members must exist inside an abstract class, which cannot be directly instantiated.