TypeScript from A to Z — part 2: classes, extends, implements, generics, utility types