Professional TypeScript Training by Matt Pocock | Total TypeScript
Learn how to use TypeScript to level-up your applications as a web developer through exercise driven self-paced workshops and tutorials hosted by TypeScript wizard Matt Pocock.
More
Your time is precious. You have bigger fish to fry.
You could spend that time building new features or bugfixes. You could be providing value. Instead, you're fighting TypeScript.
These days, TypeScript is an industry default. If you’re starting an enterprise app today, you’ll need a good reason NOT to use TypeScript.
So you keep on pushing - all the time feeling like you’re working against TypeScript, not with it.
The truth is that you never truly learned TypeScript, at least not in depth. That's the source of your pain.
You never developed a systematic approach to solving type errors.
You never developed a mental model for understanding when to use any.
You never understood the power of generics.
Ultimately…
You never learned the underlying principles and patterns of being an effective TypeScript engineer.
An exercise-driven approach for learning TypeScript
Total TypeScript's approach is different than what you'll find in other online courses.
Instead of sitting through hours of lectures, you'll be presented with problematic code and a concise explanation of what needs to be done.
Then using your existing skills along helpful links to relevant docs and other resources, you'll have as much time as you need to complete the challenge either in your local editor or using the editor embedded into each lesson.
When you're ready, you can watch how a true TypeScript Wizard approaches solving the challenge.
The exercises build upon another, demonstrating the most important TypeScript concepts in a variety different contexts so you can build understanding of when, where, and how to best apply them in your own application and library code.
Make TypeScript work for you, not against you
What’s the thing that separates TypeScript wizards from the rest?
Understanding.
To them, TypeScript doesn’t feel like magic. It feels simple, predictable and malleable.
They can bend it to their will, and use its power for amazing DX.
Total TypeScript Core Volume is all about building that understanding at a deep level.
When you’ve completed the exercises, you’ll reach a point of mastery where very little surprises you any more.
You’ll have less fear when approaching nasty TypeScript errors, more confidence when typing dynamic signatures, gain velocity by cutting lines of code, and so much more.
You deserve so much better
You deserve a practical, systematic approach to learning TypeScript in depth.
Total TypeScript shows you the techniques used by the most complex OSS libraries.
Become your company’s resident TypeScript Wizard.
- You will become a better contributor and reviewer.
- You will be the one to unblock others and raise their velocity.
- You will be the one who knows instinctively what TypeScript is doing.
You are indispensable.
Who is Total TypeScript for?
Total TypeScript Core Volume is suitable for any developer who is ready to work at becoming a wizard, though some basic familiarity with TypeScript is recommended.
The Type Transformations workshop begins by warming you up with exercises on basic inference and essential types.
Then nearly 150 exercises later, the Advanced TypeScript Patterns workshop will have you creating chainable method abstractions with generics and the builder pattern.
Check out the free Beginner's Tutorial to set a foundation and get an idea for the workshop's teaching approach.
Total TypeScript Core Volume
The Total TypeScript Core Volume contains three professional-grade workshops for you to achieve TypeScript Wizardry:
- Type Transformations (7 sections, 50+ exercises)
- TypeScript Generics (6 sections, 40+ exercises)
- Advanced TypeScript Patterns (7 sections, 40+ exercises)
Each workshop contains dozens of exercises designed to put your problem solving skills to the test.
Professional TypeScript Workshops
Type Transformations
The Type Transformations workshop is your guide to TypeScript features and patterns that allow you to manipulate types to produce exactly what you want. As you begin to see how the pieces fit together, you’ll find yourself writing less code that is easier to maintain.
There are over 50 exercises in this workshop, each with a challenge designed to help you learn to wield the power of transforming strings into objects, objects into unions, and everything in between.
TypeScript Generics
The Generics workshop is your guide to mastering one of TypeScript's most complex features.
Through dozens of exercises, you'll get to grips with generics from the lowest level, up through examples of how your favorite TS libraries use them.
Advanced TypeScript Patterns
The Advanced Patterns workshop is a primer on several patterns that emerge from TypeScript's primitives. We'll build on the generics and type transformations work we've done so far - extracting methods for architecting them into novel solutions.
Most of these patterns aren't documented by TypeScript - they've been discovered and iterated on by the TypeScript community. Each section focuses on a different pattern via interactive exercises.
This workshop is not appropriate for beginners.
Watch Online Professional TypeScript Training by Matt Pocock | Total TypeScript
# | Title | Duration |
---|---|---|
1 | Type Transformations Workshop Welcome: Explainer | 01:09 |
2 | Get the Return Type of a Function | 00:40 |
3 | Use a Utility Type to Extract a Function’s Return Type | 01:31 |
4 | Typeof Keyword, and Type Level | 02:02 |
5 | Extract Function Parameters Into A Type | 00:25 |
6 | Use a Utility Type to Extract Function Parameters | 00:46 |
7 | Extract The Awaited Result of a Promise | 00:38 |
8 | Use Utility Types To Extract a Promise's Result | 00:59 |
9 | Create a Union Type From an Object’s Keys | 00:34 |
10 | Create Unions from Objects Using Two Operators | 01:31 |
11 | Understand The Terminology Around Unions | 00:23 |
12 | Union Terminology Examples | 01:41 |
13 | Extracting Members of a Discriminated Union | 00:46 |
14 | Extract From A Union Using a Utility Type | 01:42 |
15 | Excluding Parts of a Discriminated Union | 00:20 |
16 | Use a Utility Type to Remove a Single Member of a Union | 00:32 |
17 | The Power of Union Types in TypeScript: Explainer | 02:47 |
18 | Extract Object Properties into Individual Types | 00:40 |
19 | Use Indexed Access Types to Extract Object Properties | 01:06 |
20 | Extract the Discriminator from a Discriminated Union | 00:25 |
21 | Simple Syntax Used to Access Parts of a Discriminated Union | 00:57 |
22 | Resolve an Object’s Values as Literal Types | 01:02 |
23 | The Annotation Used to Infer an Object's Values as Literal Types | 02:23 |
24 | Create a Union From an Object's Values | 00:53 |
25 | Extract Specific Members From A Union with Indexed Access | 01:12 |
26 | Get All of an Object’s Values | 00:27 |
27 | Use Two Operators With Indexed Access to Get All of an Object's Values | 00:56 |
28 | Create Unions out of Array Values | 00:29 |
29 | Methods Used to Create Unions out of Array Values | 01:24 |
30 | Only Allow Specified String Patterns | 00:43 |
31 | Template Literal with Strings | 01:09 |
32 | Extract Union Strings Matching a Pattern | 01:01 |
33 | Extracting String Pattern Matches with Template Literals | 01:02 |
34 | Create a Union of Strings with All Possible Permutations of Two Unions | 00:36 |
35 | Passing Unions Into Template Literals | 01:08 |
36 | Splitting A String into a Tuple | 00:45 |
37 | Using S From ts-toolbelt to Split a String Into a Tuple | 01:01 |
38 | Create an Object Whose Keys Are Derived From a Union | 00:35 |
39 | Use a Utility Type to Create An Object From A Union | 00:58 |
40 | Transform String Literals To Uppercase | 00:33 |
41 | Manipulate String Literals Using Type Helpers | 01:12 |
42 | Template Literals in Mattermost: Explainer | 01:55 |
43 | Introducing Type Helpers | 00:42 |
44 | Create Functions that Return Types | 02:46 |
45 | Creating a Maybe Type Helper | 00:23 |
46 | The Unconstrained Maybe Type Helper | 01:17 |
47 | Ensure Type Safety in a Type Helper | 01:06 |
48 | Use Constraints to Limit Type Parameters | 03:01 |
49 | Create a Reusable Type Helper | 00:27 |
50 | Add Support for Multiple Types in a Type Helper | 00:36 |
51 | Optional Type Parameters in Type Helpers | 00:43 |
52 | Set a Default Type Value in a Type Helper | 01:53 |
53 | Functions as Constraints for Type Helpers | 00:59 |
54 | Support Function Type Constraints with Variable Arguments | 02:42 |
55 | Constraining Types for Anything but null or undefined | 00:43 |
56 | Exclude null and undefined from the Maybe Type | 03:35 |
57 | Constraining Type Helpers to Non-Empty Arrays | 00:33 |
58 | Enforce a Minimum Array Length in a Type Helper | 01:58 |
59 | Explainer: Type Helpers in Redux | 04:59 |
60 | Add Conditional Logic to a Type Helper | 00:39 |
61 | Compare and Return Values with Extends and the Ternary Operator | 02:27 |
62 | Refine Conditional Logic in a Type Helper | 01:00 |
63 | Prevent Unwanted Type Scenarios from Happening | 02:22 |
64 | How TypeScript Added Conditional Types: Explainer | 01:45 |
65 | Introducing infer for Conditional Logic | 01:09 |
66 | Infer Elements Inside a Conditional with Infer | 02:43 |
67 | Extract Type Arguments to Another Type Helper | 01:00 |
68 | Use infer with Generics to Extract Types from Arguments | 02:36 |
69 | Extract Parts of a String with a Template Literal | 00:31 |
70 | Pattern Matching on Template Literals with Infer | 01:27 |
71 | Template Literal Types Were Nearly Regexes: Explainer | 02:51 |
72 | Extract the Result of an Async Function | 00:52 |
73 | Optionally Infer the Return Type of a Function | 01:23 |
74 | Extract the Result From Several Possible Function Shapes | 00:52 |
75 | Two Methods for Extracting the Result of Multiple Possible Functions | 01:17 |
76 | Distributivity in Conditional Types | 00:56 |
77 | Using Generic Context to Avoid Distributive Conditional Types | 03:03 |
78 | Map Over a Union to Create an Object | 00:40 |
79 | Use Mapped Types to Create an Object from a Union | 02:03 |
80 | Mapped Types with Objects | 00:36 |
81 | Map Over the Keys of an Object | 02:25 |
82 | Transforming Object Keys in Mapped Types | 00:54 |
83 | Remapping Object Keys in a Mapped Type | 02:10 |
84 | How Excalidraw uses Mapped Types to Save Lines of Code: Explainer | 01:45 |
85 | Conditionally Extract Properties from Object | 00:53 |
86 | Selective Remapping with Conditional Types and Template Literals | 03:15 |
87 | Map a Discriminated Union to an Object | 00:49 |
88 | Two Techniques for Mapping a Discriminated Union to an Object | 03:29 |
89 | Map an Object to a Union of Tuples | 00:52 |
90 | Create a Union of Tuples by Reindexing a Mapped Type | 02:05 |
91 | Transform an Object into a Union of Template Literals | 00:27 |
92 | Map an Object to a Union of Template Literals | 01:57 |
93 | Transform a Discriminated Union into a Union | 00:33 |
94 | Iteratively Map and Remap to Transform Types | 02:15 |
95 | Transform Path Parameters from Strings to Objects | 01:01 |
96 | Extract from String with Mapped Types, Template Literals, and infer. | 03:32 |
97 | Transform an Object into a Discriminated Union | 00:36 |
98 | Create a Discriminated Union through Intermediary Transformations | 02:40 |
99 | Transform a Discriminated Union with Unique Values to an Object | 01:06 |
100 | Create an Object using Mapped Types, Conditional Types, and TypeScript Keywords | 02:14 |
101 | Construct a Deep Partial of an Object | 01:02 |
102 | Use Recursion and Mapped Types to Create a Type Helper | 05:17 |
103 | TypeScript Generics Workshop Welcome | 01:17 |
104 | Typing Functions with Generics | 00:46 |
105 | Replace the unknown Type with a Generic | 01:54 |
106 | Restricting Generic Argument Types | 00:40 |
107 | Add Constraints to a Generic | 00:56 |
108 | Typing Independent Parameters | 00:31 |
109 | Use Multiple Generics with a Function | 01:20 |
110 | Approaches for Typing Object Parameters | 00:28 |
111 | Approaches for Typing Object Parameters: Solution | 01:51 |
112 | Generic Functions in Excalidraw | 02:20 |
113 | Generics in Classes | 00:47 |
114 | Add Types to a Class | 01:11 |
115 | Generic Mapper Function | 01:04 |
116 | Add Object Property Constraints to a Generic | 02:15 |
117 | The Importance of Generics in TypeScript | 01:29 |
118 | Add Type Parameters to a Function | 00:45 |
119 | Pass Type Arguments to a Function | 02:51 |
120 | Defaults in Type Parameters | 00:33 |
121 | Specify a Default Value | 00:45 |
122 | Infer Types from Type Arguments | 01:08 |
123 | Infer from the Type Arguments of a Class | 02:12 |
124 | Strongly Type a Reduce Function | 01:12 |
125 | Pass Type Arguments to a Reduce Function | 03:06 |
126 | Avoid any Types with Generics | 00:36 |
127 | Use Generics to Type a Fetch Request | 03:47 |
128 | Passing Type Arguments in cal.com | 02:03 |
129 | Improving Code Maintainability | 03:38 |
130 | Generics at Different Levels | 01:26 |
131 | Represent Generics at the Lowest Level | 03:04 |
132 | Typed Object Keys | 00:47 |
133 | Two Approaches for Typing Object Keys | 03:45 |
134 | Make a Generic Wrapper for a Function | 01:51 |
135 | Constrain a Type Argument to a Function | 04:49 |
136 | Understand Literal Inference in Generics | 03:54 |
137 | Understand Generic Inference When Using Objects as Arguments | 03:33 |
138 | Inferring Literal Types from any Basic Type | 00:55 |
139 | Accepting Multiple Literal Types | 00:57 |
140 | Infer the Type of an Array Member | 00:57 |
141 | Constrain to the Array Member, Not the Array | 02:14 |
142 | Generics in a Class Names Creator | 01:33 |
143 | Two Approaches to Working with Class Names | 01:44 |
144 | Generics in React Query | 04:50 |
145 | Generics with Conditional Types | 01:00 |
146 | Ensure Runtime Level & Type Level Safety with Conditional Types | 03:25 |
147 | Fixing Errors in Generic Functions | 01:22 |
148 | Fixing the "Not Assignable" Error | 02:30 |
149 | Generic Function Currying | 01:08 |
150 | Fix Type Inference in Curried Functions | 03:21 |
151 | Generic Interfaces with Functions | 02:28 |
152 | Understanding Generics at Different Levels of Functions | 04:32 |
153 | Spotting Useless Generics | 00:58 |
154 | Refactoring Functions with Unnecessary Type Arguments | 01:32 |
155 | Spotting Missing Generics | 01:32 |
156 | Improving Type Inference with Additional Generics | 02:53 |
157 | How tRPC Handles Inheritable Generics | 03:33 |
158 | Refactoring Generics for a Cleaner API | 01:37 |
159 | Create a Factory Function to Apply Type Arguments to All Child Functions | 02:11 |
160 | The Partial Inference Problem | 01:53 |
161 | A Workaround for The Lack of Partial Inference | 03:57 |
162 | What is a Function Overload? | 00:42 |
163 | Understanding Function Overloads | 01:08 |
164 | Function Overloads vs. Conditional Types | 00:32 |
165 | Match Return Types with Function Overloads | 03:29 |
166 | Debugging Overloaded Functions | 01:18 |
167 | Specifying Types for an Overloaded Function | 03:53 |
168 | Function Overloads vs. Union Types | 00:46 |
169 | When to Use Overloads and Unions | 02:03 |
170 | Generics in Function Overloads | 00:43 |
171 | Typing Different Function Use Cases | 02:50 |
172 | Solving an Inference Mystery | 01:00 |
173 | The Inference Mystery Solved | 06:10 |
174 | Use Function Overloads to Infer Initial Data | 01:17 |
175 | Split Functions Into Two Different Call Signatures | 02:11 |
176 | The "Instantiated with Subtype" Error | 01:48 |
177 | Handling Default Arguments with Function Overloads | 03:52 |
178 | Make An Infinite Scroll Function Generic with Correct Type Inference | 01:17 |
179 | Introduce a Type Parameter to Ensure Type Consistency | 05:03 |
180 | Create a Function with a Dynamic Number of Arguments | 01:34 |
181 | Use a Tuple to Represent a Dynamic Number of Arguments | 03:44 |
182 | Create a Pick Function | 01:10 |
183 | Extracting Object Properties with Reduce and Generics | 07:54 |
184 | Create a Form Validation Library | 02:02 |
185 | Add Strong Typing and Proper Error Handling to a Form Validator | 06:34 |
186 | Improve a Fetch Function to Handle Missing Type Arguments | 01:20 |
187 | Modify a Generic Type Default for Improved Error Messages | 01:55 |
188 | Typing a Function Composition with Overloads and Generics | 02:22 |
189 | Using Overloads and Generics to Type Function Composition | 05:53 |
190 | Build an Internationalization Library | 02:32 |
191 | Extract Types from Strings for an Internationalization Library | 07:46 |
192 | Advanced Workshop Welcome | 01:14 |
193 | What is a Branded Type? | 03:23 |
194 | Form Validation with Branded Types | 01:39 |
195 | Assigning Branded Types to Values | 01:38 |
196 | Using Branded Types as Entity Id’s | 00:43 |
197 | Add Branded Types to Functions and Models | 02:54 |
198 | Creating Reusable Validity Checks with Branded Types and Type Helpers | 01:10 |
199 | Combine Type Helpers with Branded Types | 01:52 |
200 | Creating Validation Boundaries with Branded Types | 01:54 |
201 | Using Branded Types to Validate Code Logic | 03:45 |
202 | Using Index Signatures with Branded Types | 01:14 |
203 | Indexing an Object with Branded Types | 02:20 |
204 | TypeScript's Global Scope | 01:02 |
205 | Add a Function to the Global Scope | 04:37 |
206 | Add Functionality to Existing Global Interfaces | 01:03 |
207 | Use Declaration Merging to Add Functionality to the Global Window | 04:43 |
208 | Add Types to Properties of Global Namespaced Interfaces | 01:03 |
209 | Typing process.env in the NodeJS Namespace | 03:26 |
210 | Colocating Types for Global Interfaces | 02:00 |
211 | Solving the Colocation Problem with Globals | 02:56 |
212 | Filtering with Type Predicates | 00:49 |
213 | Use a Type Predicate to Filter Types | 02:56 |
214 | Checking Types with Assertion Functions | 01:13 |
215 | Ensure Valid Types with an Assertion Function | 02:46 |
216 | Avoiding TypeScript's Most Confusing Error | 00:48 |
217 | Declare Assertion Functions Properly to Avoid Confusing Errors | 00:37 |
218 | Combining Type Predicates with Generics | 01:45 |
219 | Filtering with Type Predicates and Generics | 02:35 |
220 | Combining Brands and Type Predicates | 00:50 |
221 | Checking for Validity with Brands and Type Predicates | 00:44 |
222 | Combining Brands with Assertion Functions | 00:24 |
223 | Validate Types with Brands and Assertions | 01:05 |
224 | Classes as Types and Values | 01:02 |
225 | Using Classes in TypeScript | 00:54 |
226 | Dive into Classes with Type Predicates | 02:13 |
227 | Simplifying TypeScript with Type Predicates | 02:41 |
228 | Assertion Functions and Classes | 01:25 |
229 | Leverage Assertion Functions for Better Inference in Classes | 01:27 |
230 | Class Implementation Following the Builder Pattern | 07:44 |
231 | TRPC's Creator on the Builder Pattern | 04:08 |
232 | Create a Type Safe Map with the Builder Pattern | 01:09 |
233 | Getters and Setters in the Builder Pattern | 02:19 |
234 | Debugging the Builder Pattern | 00:41 |
235 | Default Generics in the Builder Pattern | 02:41 |
236 | Building Chainable Middleware with the Builder Pattern | 03:40 |
237 | The Power of Generics and the Builder Pattern | 06:37 |
238 | Subclassing in Zod | 03:18 |
239 | Where Do External Types Come From? | 05:24 |
240 | Extract Types to Extend an External Library | 00:59 |
241 | Retrieve Function Parameters from an External Library | 02:00 |
242 | Navigating Lodash's Type Definitions | 03:26 |
243 | Finding Proper Type Arguments and Generics with Lodash | 01:21 |
244 | Passing Type Arguments with Lodash | 05:15 |
245 | Navigating Express's Type Definitions | 09:06 |
246 | Add Query Params to an Express Request | 01:18 |
247 | Make an Express Request Function Generic | 03:44 |
248 | Browsing Zod's Types | 02:45 |
249 | Create a Runtime and Type Safe Function with Generics and Zod | 01:39 |
250 | Infer Runtime Arguments from a Zod Schema | 04:38 |
251 | Override External Library Types | 01:38 |
252 | Create a Declarations File to Override Types | 03:50 |
253 | Identity Functions as an Alternative to the `as const` | 01:31 |
254 | Using const type parameters For Better Inference | 02:05 |
255 | Add Constraints to an Identity Function | 00:47 |
256 | Constraining and Narrowing an Identity Function | 02:51 |
257 | Specifying Where Inference Should Not Happen | 01:38 |
258 | Fix Inference Issues with F.NoInfer | 02:17 |
259 | Find the Generic Flow of an Identity Function | 01:10 |
260 | Avoid Duplicate Code in an Identity Function with Generics | 02:39 |
261 | Reverse Mapped Types | 01:19 |
262 | Inference Inception in an Identity Function | 02:17 |
263 | Merge Dynamic Objects with Global Objects | 00:59 |
264 | Add Objects to the Global Scope Dynamically | 02:19 |
265 | Narrowing with an Array | 01:19 |
266 | Narrowing with Arrays and Generics | 08:30 |
267 | Create a Type-Safe Request Handler with Zod and Express | 01:59 |
268 | Type-Safe Request Handlers with Zod and Express | 07:45 |
269 | Building a Dynamic Reducer | 03:55 |
270 | Dynamic Reducer with Generic Types | 11:26 |
271 | Custom JSX Elements | 01:06 |
272 | Adding Custom Elements to JSX.IntrinsicElements | 04:01 |
273 | Tejas Kumar Discusses How to Build Bulletproof Apps with TypeScript | 52:27 |
274 | Adopting TypeScript at Netflix with Shaundai Person | 43:02 |
275 | Mark Erikson on Avoiding Breaking Changes and Improving Maintainability with TypeScript | 54:35 |
276 | The TypeScript Culture at Formidable with Kadi Kraman | 42:01 |
277 | Colin McDonnell Talks About The Design Choices Behind Zod | 01:01:20 |
278 | TypeScript's History and Growth with Daniel Rosenwasser | 56:41 |
279 | Priscila Oliveira on Sentry's TypeScript Migration | 43:52 |
280 | Gabriel Vergnaud on Type and Value Level Mapping in TypeScript | 48:45 |
281 | Building Familiarity with TypeScript's Syntax and Functionality with Orta Therox | 49:57 |
282 | A Look at tRPC with its Creator Alex "KATT" Johansson | 40:46 |
283 | Exploring Generics in React Query with Tanner Linsley | 52:39 |
284 | Type-Checking React Props With Discriminated Unions | 01:18 |
285 | Using Discriminated Unions to Create Flexible Component Props in React | 01:45 |
286 | Destructuring Discriminated Unions in React Props | 00:48 |
287 | Destructuring vs Accessing Discriminated Union Props | 02:32 |
288 | Adding a Prop Required Across Discriminated Union Variants | 05:15 |
289 | Resolving Discriminated Union Types with an Intersection | 03:37 |
290 | Differentiating Props With a Boolean Discriminator | 02:24 |
291 | Discriminated Unions for Conditional Props in TypeScript | 00:49 |
292 | Using the Record Type to Represent an Empty Object | 02:28 |
293 | Conditionally Require Props With Discriminated Unions | 01:19 |
294 | Allow Optional Props Using A Discriminated Union Branch With Undefined Types | 02:16 |
295 | Finding a Better Type Definition For A Mapped Component | 02:17 |
296 | What's The Difference Between React.ReactNode and React.FC? | 01:23 |
297 | Syncing Types without Manual Updates | 02:38 |
298 | The `keyof typeof` Pattern | 01:05 |
299 | The Partial Autocompletion Quirk | 04:17 |
300 | Solving Partial Autocompletion | 01:21 |
301 | Extracting Keys and Values from a Type | 01:43 |
302 | Using `as const` and Indexed Access Types to Extract Keys and Values from a Type | 02:19 |
303 | Ensuring Correct Inference for Prop Types | 01:25 |
304 | Comparing `as const`, `as`, and `satisfies` | 01:18 |
305 | Inference from a Single Source of Truth | 00:54 |
306 | Understanding and Implementing Dynamic Props Mapping in React | 03:29 |
307 | DRY out Code with Generic Type Helpers | 01:17 |
308 | Implement a Generic Type Helper | 01:27 |
309 | Refactoring to a Type Helper | 03:36 |
310 | Creating an "All or Nothing" Type Helper for React props | 04:30 |
311 | Constraining a Type Helper to Accept Specific Values | 01:04 |
312 | Add Generic Constraints to Type Helpers | 03:30 |
313 | Adding Type Arguments to a Hook | 01:50 |
314 | Adding Type Arguments to a Function | 02:56 |
315 | Wrapping a Generic Function Inside of Another | 01:19 |
316 | Type Inference with Generic Functions in TypeScript | 04:18 |
317 | Applying Generics to Components | 01:46 |
318 | Add a Generic Type Argument to a Props Interface | 00:50 |
319 | Generics in Class Components | 01:18 |
320 | Converting a Class Component to be Generic | 01:49 |
321 | Passing Type Arguments To Components | 02:18 |
322 | Use the Angle Brackets Syntax to Pass a type to a Component | 01:17 |
323 | Generic Inference through Multiple Type Helpers | 03:55 |
324 | Adding Generic Type Arguments to Type Helpers | 04:49 |
325 | Build a useMutation hook | 02:36 |
326 | Refactoring a Generic Hook for Best Inference | 01:59 |
327 | Generics vs Discriminated Unions | 02:12 |
328 | Refactoring from Generics to a Discriminated Union | 00:40 |
329 | Fixing Type Inference in a Custom React Hook | 02:12 |
330 | Use 'as const' to Infer a Tuple return type | 08:06 |
331 | Strongly Typing React Context | 01:56 |
332 | Using Type Arguments to Create A Strongly Typed Context | 01:54 |
333 | Using TypeScript to Manage Complex State | 04:18 |
334 | Handling Complex State Management with TypeScript Unions | 01:21 |
335 | Using Discriminated Unions in useState | 01:17 |
336 | Handling Different State Values with Discriminated Unions | 01:59 |
337 | Discriminated Tuples in Custom Hooks | 01:23 |
338 | Improved Type Safety with Discriminated Tuples in TypeScript | 02:17 |
339 | Use Function Overloads for Better Type Inference | 01:14 |
340 | Overloading Functions in TypeScript | 05:32 |
341 | Mimicking useState Behavior with Function Overloads | 00:59 |
342 | Wrapping useState Functionality with Function Overloads | 03:47 |
343 | Currying Hooks | 01:29 |
344 | Inferring Type Arguments in Curried Hooks | 03:41 |
345 | Exploring the React Namespace | 01:23 |
346 | Understanding the React Namespace | 03:46 |
347 | JSX.Element, React.ReactElement, and React.ReactNode | 01:31 |
348 | Understanding React's JSX Types | 06:06 |
349 | Strongly Typing Children in React | 01:45 |
350 | Strongly Typing Children in React Doesn't Work | 03:08 |
351 | Exploring JSX.IntrinsicElements | 01:04 |
352 | Understand the Structure of React's JSX.IntrinsicElements | 02:55 |
353 | Understanding React's ElementType and ComponentType | 02:35 |
354 | Appending to React's Global Namespace | 00:31 |
355 | Declaration Merging and the Global Namespace | 01:04 |
356 | Modify Existing Interfaces in the Global React Namespace | 00:53 |
357 | Extend the Global React namespace with Declaration Merging in TypeScript | 00:53 |
358 | Add a New Global Element in TypeScript | 00:45 |
359 | Extend JSX.IntrinsicElements with Declaration Merging | 02:18 |
360 | Exploring HTML Attribute and Element Types | 01:17 |
361 | Navigating HTMLAttribute types | 04:40 |
362 | Add Attributes to All Elements with Declaration Merging | 00:37 |
363 | Updating the Global Namespace for an Additional Attribute | 02:28 |
364 | Strongly Typed Lazy Loading | 01:30 |
365 | Strongly Typing Lazy Loaded Components with Generics | 05:07 |
366 | Render Props | 01:40 |
367 | Typing the Children Prop for Render Props | 02:38 |
368 | Records of Components with the Same Props | 01:37 |
369 | Infer Shared Props for Multiple Components | 03:34 |
370 | The Problem With forwardRef | 06:43 |
371 | Fixing forwardRef Locally | 01:03 |
372 | Override forwardRef's Behavior Locally | 01:58 |
373 | Typing Higher Order Components | 01:39 |
374 | Implementing a Generic Higher Order Component | 04:45 |
375 | Using Higher Order Components with Generic Components | 01:34 |
376 | Add Generic Component Support to a Higher Order Component | 04:51 |
377 | The `as` Prop in React | 02:29 |
378 | Approaching the `as` Prop with IIMTs and Generics | 07:06 |
379 | The `as` Prop with Custom Components | 01:27 |
380 | Type Helpers for React Components | 03:17 |
381 | The `as` Prop with Defaults | 01:31 |
382 | Two Approaches to Defaults for the `as` Prop | 05:25 |
383 | The `as` Prop with `forwardRef` | 01:45 |
384 | Distributive Omit with the `as` Prop | 07:38 |
385 | React Hook Form's Types | 02:50 |
386 | Understanding useForm Type Declarations in React Hook Form | 05:43 |
387 | Wrapping the useForm Hook from React Hook Form | 01:28 |
388 | Creating a Generic Wrapper for useForm | 04:55 |
389 | React-Select's Generics | 01:58 |
390 | Capture and Extend React Select's Type Definitions | 06:07 |
391 | Understanding React Query's Overloads | 03:05 |
392 | Targeting Overloads with useQuery | 08:01 |
393 | Wrapping useQuery | 01:26 |
394 | Handling Type Arguments in a Custom Query Hook | 05:43 |