Fork me on GitHub

TypeScript Progression Ladder

The TypeScript progression ladder is a grouping of concepts and skills relevant to TypeScript programming. It provides aspiring TypeScript programmers with a way to track and improve their TypeScript skills.

novice
CONCEPTS SKILLS RESOURCES COMPLETED
Type inference Understand how TS automatically identifies the type of a variable or object link link
Type annotations Declare the types of a variable or object when the type inference system is not enough link link
Primitive types Declare and work with basic types link
Non-nullable types Avoid potential error by making null and undefined explicit link link
Structural type system Understand the difference with a nominal type system and the type compatibility rules link link
Function declarations & function expressions Understand the differences between function expressions and declarations link link
Enumerations Avoid magic strings and code duplication link link link
Object literals Declare and work with object instances link link link
Arrays Declare and work with arrays link
Tuples Declare and work with tuples link
Interfaces Declare and work with interfaces link link
Classes Declare and work with classes link link
Modules Organize code bases link link
Namespaces Declare and work with namespaces link link link
Triple-Slash Directives Include additional type definition files in the compilation process link
String templates & tagged templates Generate new strings at runtime link link
advanced_beginner
CONCEPTS SKILLS RESOURCES COMPLETED
Local types Declare local classes, interfaces, enums, and type aliases link
Ambient declarations Work with existing JavaScript libraries and APIs link link link
Scope and hoisting Prevent issues by limiting the scope of variables link link link
Type assertions and casting Change the type of a variable or object link
Function types Declare the type of functions such as callbacks link link
Arrow functions Prevent issues with the this operator link
Optional and default parameters Declare optional and default function arguments link
Rest parameters Declare functions with an arbitrary number of arguments link
Destructuring assignment Extract variables from the properties of an object link link
Union types Declare wider types from existing types link
Intersection types Declare narrower types from existing types link
Type aliases Declare aliases for existing types link
Literal types Narrow down primitive types to concrete values such as object keys link link
Control-flow analysis Understand how TypeScript narrows down a given types link
Type guards Have control over how the TypeScript compiler narrows down a given type link link
The never type Detect dead end code paths and unnecessary type guards link
The unknown type Prevent errors by making uncertainty explicit link
Readonly Prevent issues by avoiding property mutations link link
Strict property initialization Prevent errors by ensuring that classes are correctly initialized link
Inheritance Re-use code by extending existing classes link link
Mixins Take advantage situations in which multiple inheritance is safe link link link
Abstract classes Reuse code using abstract classes link link
competent
CONCEPTS SKILLS RESOURCES COMPLETED
Built-in type declarations (lib.d.ts) Avoid re-declaring existing JavaScript APIs link
Index signature Type-safe property access by index link link
Weak types Prevent adding wrong properties to objects with optional properties link link
Function overloading Create multiple functions of the same name with different arguments link link
Closures Implement higher-order functions link link
Prototypes Understand how objects and inheritance work at runtime link link
The this operator Prevent and understand potential runtime issues link link
Generic types Avoid type assertions in re-usable code link
Generic defaults Avoid empty object as the default value for generic parameters link
Generic constraints Limit the types that can be used as a generic parameter link
Custom type guards Narrow down union types link link
Promises Avoid callback hells and gain more control over asynchronous operations link link
Async/await Write asynchronous code that looks synchronous link link link
Decorators Implement the decorator pattern and declare metadata for libraries and tools link
Symbols Declare unique identifiers at runtime link
JSX Understand the template systems of UI libraries such as React link
Discriminated unions Narrow down union types using literal types link link
proficient
CONCEPTS SKILLS RESOURCES COMPLETED
The keyof operator Extract the keys of an object as literal types link
Lookup types Use literal types and index types to extract the type of a property of a given type link
Polymorphic this type Express hierarchical fluent interfaces with ease link
Mapped types Map the type of all the properties in an object to a different type link link
Built-in mapped types Avoid re-declaring existing mapped types link
Conditional types Map the type of some of the properties in an object to a different type link
Built-in conditional types Avoid re-declaring existing conditional types link
The infer keyword Extract types from existing types such as the value of an element in an array or the return in a function link
Generators (function*) Declare functions that can be exited and later re-entered link link link link
Asynchronous generators and iterators (for await … of) Iterate collections for asynchronous values link link
Delegating to another generator (yield*) Implement sagas and other advances asynchronous programming patterns link
Type Checking JavaScript Files Find type errors in JavaScript files link link
Function, bind, call and apply Partially apply functions link link link link
The JavaScript event loop Understand potential complex runtime and performance issues link link
expert
CONCEPTS SKILLS RESOURCES COMPLETED
Module resolution rules Understand how TypeScript resolves modules link
Implement type definitions Create type definitions when they are not available link link
Compiler internal APIs Create code analysis tools and contribute to the compiler link link link
Language services APIs Create code analysis tools and IDE plugins link
Path mapping Simplify refactoring of directories in large projects link link
Project references Faster build for large projects and monorepos link
Please note: some of the preceding topics such as promises are not only relevant to TypeScript (as they are also relevant to JavaScript). These topics have been included because we assume that a novice reader has no previous experience with both JavaScript and TypeScript
This is a community-driven document, please share your feedback, help us to improve it. Please open an issue or send us a PR on Github!

Contributors

Remo H. Jansen https://twitter.com/RemoHJansen

We need your help!

This is a community-driven project, please share your feedback and help us to improve it.
Please open an issue or send us a PR on GitHub!