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!