Table of contents : 1. Project Setup 1.1. Type-checking JavaScript 1.2. Installing TypeScript 1.3. Keeping Types on the Side 1.4. Migrating a Project to TypeScript 1.5. Loading Types from Definitely Typed 1.6. Setting up A Full-stack Project 1.7. Setting Up Tests 1.8. Typing ECMAScript Modules from URLs 1.9. Loading Different Module Types in Node 1.10. Working with Deno and Dependencies 1.11. Using Pre-defined Configurations 2. Basic Types 2.1. Annotating Effectively 2.2. Working with any and unknown 2.3. Choosing the Right Object Type 2.4. Working with Tuple Types 2.5. Understanding Interfaces vs Type Aliases 2.6. Defining Function Overloads 2.7. Defining this Parameter Types 2.8. Working with Symbols 2.9. Understanding Value and Type Namespaces 3. The Type System 3.1. Modeling Data with Union and Intersection Types 3.2. Explicitly Defining Models with Discriminated Union Types 3.3. Exhaustiveness Checking with the Assert never Technique 3.4. Pinning Types with const Context 3.5. Narrowing Types with Type Predicates 3.6. Understanding void 3.7. Dealing with Error Types in Catch Clauses 3.8. Creating Exclusive Or Models with Optional never 3.9. Effectively Using Type Assertions 3.10. Using Index Signatures 3.11. Distinguish Missing Properties and Undefined Values 3.12. Working with Enums 3.13. Defining Nominal Types in a Structural Type System 3.14. Enabling Loose Autocomplete for String Subsets 4. Generics 4.1. Generalizing Function Signatures 4.2. Creating Related Function Arguments 4.3. Getting Rid of any and unknown 4.4. Understanding Generic Instantiation 4.5. Generating New Object Types 4.6. Modifying Objects with Assertion Signatures 4.7. Mapping Types with Type Maps 4.8. Using ThisType to Define this in Objects 5. Conditional Types 5.1. Managing Complex Function Signatures 5.2. Filtering with never 5.3. Grouping Elements by Kind 5.4. Removing Specific Object Properties 5.5. Inferring Types in Conditionals 6. String Template Literal Types 6.1. Defining a Custom Event System 6.2. Creating Event Callbacks with String Manipulation Types and Key Re-Mapping 6.3. Writing a Formatter Function 6.4. Extracting Format Parameter Types 6.5. Dealing with Recursion Limits 6.6. Using Template Literals as Discriminants About the Author