TypeScript is not a language you can fully understand in isolation — it is a type layer over JavaScript, and its quirks make sense only when you know the language underneath. Skip the JavaScript foundation and TypeScript's structural typing and inference feel arbitrary.
So the right order starts with genuinely understanding JavaScript, then learns TypeScript's type system in increasing depth, and finishes with the architectural knowledge you need to keep a large typed codebase coherent. That progression turns the type checker from a nag into a design tool.
Ground yourself in JavaScript
Begin with JavaScript, the famously concise book that separates the language's good parts from its pitfalls — essential context for understanding why TypeScript exists. Follow it with You Don't Know JS: ES6 & Beyond, which covers the modern JavaScript features that TypeScript builds directly on top of. With those in hand, the type layer will feel like a natural addition rather than a foreign system.
Learn the type system
Now bring in the types. Learning TypeScript is an approachable, modern introduction that teaches the type system from the ground up, and TypeScript Quickly reinforces it with practical, project-oriented examples. Move on to Programming TypeScript for a thorough treatment of the language's features, and TypeScript Deep Dive as a reference for the corners and edge cases you will eventually hit.
Master effective, large-scale use
The step from writing TypeScript to writing it well is Effective TypeScript, a guidelines-style book that teaches the idioms and mental models the best developers use daily — how to model data, when to trust inference, and how to avoid fighting the compiler. As your applications grow, Designing Data-Intensive Applications rounds out the picture, giving you the systems-level understanding needed to build the backends your typed frontends talk to.
Read in this order and TypeScript stops being "JavaScript with annotations" and becomes a way of designing software so that whole categories of bugs cannot happen. Follow the full path from your first typed variable to large-scale, maintainable applications.