
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!