Generics: The most intimidating TypeScript feature

  Рет қаралды 164,032

Matt Pocock

Matt Pocock

Күн бұрын

Generics are a huge reason why TypeScript is SO DARN POWERFUL. Letting you create types from other types, pass types to functions, and even INFER those types without you needing to specify them.
They're pretty advanced, though - so if you want to learn more advanced TypeScript, time to strap in.
Become a TypeScript Wizard with Matt's TypeScript Course:
www.totaltypescript.com/
Follow Matt on Twitter
/ mattpocockuk
00:00 Intro
00:36 Generics on the type level
01:45 Passing type arguments to functions
03:06 Passing type arguments to Set
04:21 Inferring the types
05:55 Constraints on type arguments
08:19 Constraints in functions
10:07 Sometimes 'as' is fine
11:23 Multiple type arguments
14:05 Defaults in type arguments
15:00 Integrating with third-party libraries
17:26 Outro

Пікірлер: 224
@DjokovicAirlines
@DjokovicAirlines Жыл бұрын
Matt, you are the Wizard. I can't describe how helpful this video was for me. It's purely golden. Thank you for your work!
@Deliverant
@Deliverant Жыл бұрын
Please never stop doing these videos, you're my inspiration
@nikostsakas7742
@nikostsakas7742 Жыл бұрын
The stuff about apis is golden, I recently did a similar thing to stop typing JSON responses as 'any' and it really helped with leveraging Typescript to handle edge cases etc. I haven't used schema validation yet, but seeing how clean the code is, it's really enticing.
@F4LLEND4RK
@F4LLEND4RK 7 ай бұрын
Brilliant video, learnt a lot - I've never really looked into generics before, so, now my Typescript knowledge really has gone up a level.
@Ageofzetta
@Ageofzetta Жыл бұрын
Straight to bookmarks. You're an amazing teacher!!
@chrisjames278
@chrisjames278 Жыл бұрын
Thanks, Great video! Look forward to going through it in total typescript
@stonecoldcold2941
@stonecoldcold2941 Жыл бұрын
One of the best videos out there on Typescript Generics!
@shivamjhaa
@shivamjhaa Жыл бұрын
This is actually really awesome. The light bulb moment for me was "Take generic from inward to outward": as in, generics can be inferred from the arguments passed to a function. This is very poweful
@stiwart83
@stiwart83 5 ай бұрын
Amazing video Matt, thank you so much!
@ori_geva
@ori_geva 11 ай бұрын
Hey Matt, your videos are very helpful, you're covering features in TypeScript I needed and didn't know exist. It'd be so great if you could give and example of a scenario before explaining a TS solution, for the more complicated ones. Leaving out inline object types (like { firstName: string, lastName: string } would be nice too just so there's less to process heh.
@maxtsh
@maxtsh 9 ай бұрын
Love this Matt, thank you so much
@jonatanferenczfi189
@jonatanferenczfi189 Жыл бұрын
Great video. Not many new things for me. But it's really good to see someone making truly advanced topic videos on TS. Keep it up 🚀
@BlurryBit
@BlurryBit Жыл бұрын
The most helpful video I have seen for a while. :) Adding to bookmark for using as a documentation.
@brangtoggez6363
@brangtoggez6363 Жыл бұрын
I love you Matt, free contents that you produced are chef kisses. I am always craving for more.
@nikhilgeorgemathew791
@nikhilgeorgemathew791 5 ай бұрын
best video i have seen in a while on yt. thankyou!
@Noway1252
@Noway1252 Жыл бұрын
What a wonderful video! I wish I can like it more than once. Thanks a lot Matt
@alexodan
@alexodan Жыл бұрын
amazing stuff Matt thanks for those tips🙌 they were really 🔥🔥🔥
@jainebri
@jainebri 3 ай бұрын
Amazing Matt ... Just Amazing !!! Thanks
@learner8084
@learner8084 10 ай бұрын
Thanks very much for the video. This is a real eye opener.
@bagaskara1567
@bagaskara1567 11 ай бұрын
very clear explanation, amazing
@luczztem
@luczztem 10 ай бұрын
bro this is wonderful you explained it VERY well
@celica96
@celica96 Жыл бұрын
Many cool pieces of advice. Thank you!
@christopheanfry2425
@christopheanfry2425 Жыл бұрын
So nice video!! I’m starting with typescript so not sure if I get it well but what I understand is that generics help typescript to infer on the arguments we pass in a function and give the proper return type. So a well defined generic in a function will give a much easier function handling when using it. Sorry if it’s not clear for me just try to understand. Thanks anyway for this video will work on it.
@joelmturner
@joelmturner Жыл бұрын
Excellent tips, thank you!
@qodesmith520
@qodesmith520 Жыл бұрын
Always A+ content. Thanks for this!
@msich
@msich Жыл бұрын
This is awesome Matt 🙌🏻
@eliasmangoro413
@eliasmangoro413 Жыл бұрын
Nice video! Another tip is you can do generic type inference from a function return type, in the same way you can do it for function parameters
@justingolden21
@justingolden21 Жыл бұрын
This man is on another level! Subbed!
@emiletremblay1377
@emiletremblay1377 Жыл бұрын
that's it im sold. Subbing to this gold channel
@eliasvasques80
@eliasvasques80 Жыл бұрын
Thanks man, very good content.
@ffedchik
@ffedchik Жыл бұрын
Amazing! Thnx Matt
@m_hussain_mustafa
@m_hussain_mustafa 2 ай бұрын
Great video!
@torontodev525
@torontodev525 4 ай бұрын
Legend! thanks mate, the best of the best of the best :) 🙏🏼
@InitCode
@InitCode 2 ай бұрын
Hey Matt, I've been following you on X for sometimes and learned a lot from about TS. And here as well.... Subscribed 😍
@juansereina_
@juansereina_ Жыл бұрын
The more I watch your videos I love TS more! 🧡
@alpakarosa3678
@alpakarosa3678 Жыл бұрын
This video makes me love more typescript!
@maker_aleks
@maker_aleks Жыл бұрын
Really good explanation! 👍
@patricknelson
@patricknelson 5 ай бұрын
Like and subscribed. Awesome tips, they proved to be particularly useful for me just to learn.
@oussamabenchkroune3151
@oussamabenchkroune3151 Жыл бұрын
Thank you for the effort to make this awesome and useful video, Much love
@i4o
@i4o Жыл бұрын
Coincidentally, I just watched your generics video on LWJ and was doing those exercises. This is a great video. Lot of things clicked for me with generics! Thanks Matt!
@andyl.5998
@andyl.5998 Жыл бұрын
What's LWJ, if I may ask?
@kidussolomon9708
@kidussolomon9708 Жыл бұрын
@@andyl.5998 Learn With Jason www.youtube.com/@learnwithjason
@aaronmiller1835
@aaronmiller1835 Жыл бұрын
@@andyl.5998 Learn With Jason, if you haven't found it already
@firasnizam
@firasnizam 11 ай бұрын
great, direct into the point
@TeaBroski
@TeaBroski 11 ай бұрын
Thanks for sharing, great tips and I didn't know much about generic types. I just fear huge overheads, especially in the code readability department. When these types of codebases are written in real world scenarios, things turn pretty ugly pretty quickly. And usually, when the wizard who wrote this dark spells on a magic mushroom microdose induced flow state goes for the better paying company, the rest of people is left scrambling in chaos. Sometimes, especially for large companies with mixed teams, it's ok to be a bit verbose and repetitive if it leads to faster handovers and a better overall team experience. That said, we (as the JS community) need to mature towards more advanced design patterns. Was great learning about generic types today, thanks for sharing!
@RmonikMusic
@RmonikMusic 9 ай бұрын
In general, you'll mostly see generics, conditional types, the "infer" keyword, etc used in packages to make them as strictly typed but broadly usable as possible. In real-world production code, I would indeed avoid complex types and be more verbose about your typing.
@vaidassiburskis
@vaidassiburskis Жыл бұрын
Nice work Matt
@jeffreysegovia7656
@jeffreysegovia7656 Жыл бұрын
Thank you Matt!
@FranciscoLopez-jc6vq
@FranciscoLopez-jc6vq Жыл бұрын
Great video, Matt. Hats off ;)
@WaterJay
@WaterJay Жыл бұрын
this video is just immensely helpful
@EngineerNick
@EngineerNick Жыл бұрын
Thankyou this was super useful :)
@webdev5180
@webdev5180 Жыл бұрын
I love this video so much !
@erikslorenz
@erikslorenz Жыл бұрын
Tip 10 is the best one! Just did something similar the other day.
@sandeepreddy6247
@sandeepreddy6247 9 ай бұрын
this is absolute masterclass...
@criticalthinker88gis13
@criticalthinker88gis13 11 ай бұрын
Superb video
@mehrdadarman
@mehrdadarman 11 ай бұрын
spectacular tips
@Abdulrahman-zj8cv
@Abdulrahman-zj8cv Жыл бұрын
Thank you so much man you are great, bless you.
@JulianHarris
@JulianHarris Жыл бұрын
Outstanding. Last time I used generics was C++ and Java in the late 90s probably before most of the other commenters were born😂 and it’s really great to see the inference capabilities to avoid “type stuttering” you otherwise get.
@AlfonsoBlanco-co5ql
@AlfonsoBlanco-co5ql 2 ай бұрын
You are so cool while explaining!!!
@eulucascampelo
@eulucascampelo Жыл бұрын
<a href="#" class="seekto" data-time="843">14:03</a> is the better part of this video 😁
@lukadimnik1554
@lukadimnik1554 Жыл бұрын
At <a href="#" class="seekto" data-time="840">14:00</a> I laughed so hard. Really good explanation of generics. Good job.
@richards16
@richards16 5 ай бұрын
Yeah right, the guy really likes Generics LOL!
@artless-soul
@artless-soul Жыл бұрын
Thank you Matt for all this great content! May be consider slowing down a bit so we get time to grasp the content and avoid head spinning injury by having to rerun videos/ play at lower speed with robot voice 😀
@LucaStasio
@LucaStasio Жыл бұрын
Man, you are the sunshine!
@pupfriend
@pupfriend Жыл бұрын
Dang. That was good. Thanks for making this.
@guytonedhai
@guytonedhai 10 ай бұрын
This is gold 🔥
@Ben-fo2vt
@Ben-fo2vt Жыл бұрын
Wow. What a helpful video.
@erlanggadewasakti
@erlanggadewasakti Жыл бұрын
Great video
@aungmyatmoemakescodework
@aungmyatmoemakescodework Жыл бұрын
I just love final part imo
@concisedeveloper
@concisedeveloper Жыл бұрын
<a href="#" class="seekto" data-time="607">10:07</a> To get the proper return type of your function, instead of type assertion, you can add it as return type to the function: const typeObjectKeys = (obj:TObj):Array =>{ return Object.keys(obj) } This would result in the perfectly valid error of "Type 'string' is not assignable to type 'never'", since empty arrays can be passed to it. Since keyof keeps the original type but Object.keys returns strings, this can cause runtime errors. The proper implementation would assure that only objects with valid keys can be accepted by the function: const typeObjectKeys = (obj:TObj):Array =>{ return Object.keys(obj) }
@robwatson826
@robwatson826 Жыл бұрын
I pressed the like button, I got a surge of dopamine 👍. Really interesting video, generics are fun!
@Praetorsss
@Praetorsss 11 ай бұрын
I have the task to write a blog post about generics and you, my lord, have completely saved me in the most important thing to do it, understanding them!
@VinitNeogi
@VinitNeogi Жыл бұрын
Which extension is it which is giving type hints using "^?"
@dentalfloss1
@dentalfloss1 Жыл бұрын
Yup I would love to know this also
@hyperprotagonist
@hyperprotagonist Жыл бұрын
twoslash-queries vscode extension.
@_timestamp
@_timestamp Жыл бұрын
@@nextmaker Thank you for this link :D
@efkastner
@efkastner Жыл бұрын
Hah nice, Matt just posted a video about this extension!
@ChillAutos
@ChillAutos Жыл бұрын
Chdck his most recdnt video
@petarkolev6928
@petarkolev6928 Жыл бұрын
Default params in TS o.O Whaaaaaaaaaaaaaat ? Matt, tip after tip and I think you can't amaze me more and there you go :D Matt, you're our hero 🍻
@alimoghadam6464
@alimoghadam6464 Жыл бұрын
I'm in love with that makeZodSafeFetch function! Thank you for this great video!
@ofekhamdi8743
@ofekhamdi8743 6 ай бұрын
Hey Matt, another great video! In the end of the video you still have to create a zod object of the type specified. Can you make zod infer the object from the schema and implement it?
@eldbudd
@eldbudd 11 ай бұрын
i wish i'd seen this video like four months ago, when i refactored an entire routing architecture, for which i found myself using what here you will see as tips 1 through 9. Had to learn it the harder way. this video would have really made the learning curve less steep. I
@skittlznt2611
@skittlznt2611 11 ай бұрын
Thanks for the videos Matt. I can imagine they take a lot to put together. Just something I've noticed, you speak really fast and take almost no breaths between words 😅 then you go from one topic to the next with almost no breaks in-between. For me personally It's really tough to follow because these are kind of complicated topics you are covering. Again, I really appreciate the time and effort you put into your videos. Just a bit of constructive feedback from one viewer. 👌🏾
@brandonz404
@brandonz404 11 ай бұрын
This video singlehandedly dissolved my fear of "complicated" typescript. I'm pretty new to it, but now I want to use generics everywhere
@aram5642
@aram5642 Жыл бұрын
Hi, is there any difference between 'object extends T' and 'T extends object'? If so, what could be an example to best illustrate a use case for one vs the other?
@onlywei
@onlywei Жыл бұрын
This video is exactly what I needed! P.S. it’s still really hard for me to get over the fact that non-Chinese people don’t know how to count to 10 on one hand.
@jcubic
@jcubic 11 ай бұрын
That was great but you did one mistake in tip 7 you don't need to use "as" in that example if you restrict the type of the object to have keys of type string. Object.keys doesn't return symbols in JavaScript but the keyof does. const typeObjectKeys = ( obj: TObj ): Array => { return Object.keys(obj); };
@bryanngen5572
@bryanngen5572 Жыл бұрын
I usually don't make comments, but this was a great video. Thank you !
@nice-vf4rj
@nice-vf4rj 6 ай бұрын
Hi Matt, great content as always, may I ask what extensions or settings you have that allows inlay hints to popup where there is "// ^?"
@wariozet591
@wariozet591 6 ай бұрын
Twoslash Query Comments
@carlosricardoziegler2650
@carlosricardoziegler2650 Жыл бұрын
Nice content, we are using it a lot with react applications. I will ask why in part of generic we need to write like instead a simple . Thanks for sharing your knowledge:)
@mattpocockuk
@mattpocockuk Жыл бұрын
Because in .tsx files is parsed as a JSX node, but isn't.
@kevduc314
@kevduc314 Жыл бұрын
Amazing video! Thank you! One question tho, for tip 7 (<a href="#" class="seekto" data-time="607">10:07</a>) wouldn't casting as Array potentially give wrong types (and thus potentially wrong linting) if some of the keys of the object are not defined as strings? Since Object.keys returns strings and even if the key is not a string (e.g. number) it's converted to a string, but `keyof TObj` doesn't convert to string and keeps the original type. In the example, that problem doesn't come up since both the "name" and "age" keys are strings, but for e.g. { name: "John", 42: "whatever value" }, if you later try to do some string-specific operation on `result`, like `result[1].charAt(0)`, the IDE will flag it as something like `Property 'charAt' doesn't exist on type '"name" | 42'`, when that's a perfectly valid thing to do since Object.keys will return the string "42" for the number key 42
@anush8
@anush8 Жыл бұрын
You're right.
@ChesterRivas
@ChesterRivas 9 ай бұрын
Did you invent Typescript? Lol. Just kidding. I watch your videos all the time. Very enjoyable.
@ChillAutos
@ChillAutos Жыл бұрын
This was a brilliant video. You are clearly incredibly knowledgeable in all things typescript so instead of just giving praise I'd offer a tiny bit of criticism, maybe it's worth something too you, maybe not. Ive watched all your videos, some multiple times, and the one thing I notice is that some examples are a little too contrived, or at least it's not clear where I'd ever use a certain tip. Ive been a professional ts dev for about a year, and I'm no where near as good as you are but I really struggle to see the use cases in some of the tips, I'm not saying they don't exist, it's just I can't see them. Your zod example is a perfect example of the type of tips I find most useful, it's clear the real world use case and the example you use is a something we might actually see in our own code bases. Basically I'm saying is love some more real world examples for some of the more complex tips you give. I think part of it is your older videos were quite short which are great for a quick look and you do a great job of explaining how it works clearly, but then the video just ends and I'm left wondering how to apply it somewhere. Overall 9/10, just thought this might be more useful just another clap emoji. Thanks for your videos, looking forward to the next one as always.
@mattpocockuk
@mattpocockuk Жыл бұрын
That's interesting! I've heard this criticism before but I consider this video to be a good example of me using real-world examples. Type safe object keys, typing Set, making type-safe fetches, integrating with Zod are all things I've been asked how to do. Which example in particular felt too abstract for you?
@mshamba8066
@mshamba8066 Жыл бұрын
good feedback ≠ criticism
@4sent4
@4sent4 9 ай бұрын
Default type parameter is actually genious feature
@mohdsahil226
@mohdsahil226 5 ай бұрын
Really great content! Please provide a Nextjs 14 course. I follow stephen grider, but your way of teaching impressed me. I would like to work for free for you! I want to improve my coding!
@MartynK981
@MartynK981 Жыл бұрын
@Matt, do you know why in example N8 (getValue function) we need explicitly provide the second generic for the keys - 'TKey extends keyof TObj'? Why the setting of the arg 'key: keyof TObj' is not enough?
@jasonstewart7983
@jasonstewart7983 Жыл бұрын
I'll attempt to answer in the absence of Matt. The issue is how to get TS to connect the return type with the input type. Since the input type is an object with multiple attributes, each with a different type, we don't want the return type to be a union of all those possible types, we want it to be keyed to the 'key' input arg. Hence we use the 2nd generic and infer the return type. On a deeper level, I'm uncertain "why" this is necessary, why TS didn't have enough information to start with. Which is something for Matt to explain.
@MartynK981
@MartynK981 Жыл бұрын
@@jasonstewart7983 Thank you
@avneet12284
@avneet12284 Жыл бұрын
crazy good
@jotasenator
@jotasenator 11 ай бұрын
let me grab a beer to make my fears go away and jump fully into this, is ok to have fear, but I need to face it
@househall
@househall 11 ай бұрын
Sometimes `as` is unavoidable indeed, but your example is dangerous. You can easily use it in typed function like `type TA = { a: number }; function getAProps(a: TA) { return typedObjectKeys(a); }` and its result will be typed as `"a"[]` but you could put a value of some type that extends TA as an argument, like `const b = { a: 2, b: 3 }; getAProps(b);` and get `["a", "b"]` result wrongly typed as `"a"[]`.
@lasfito
@lasfito Жыл бұрын
In example number 6, why do TObj extends Record when a mere Record would've sufficed?
@mattpocockuk
@mattpocockuk Жыл бұрын
Because you wouldn't get autocomplete on the key that comes back in the return type
@todorvachev891
@todorvachev891 Жыл бұрын
Example 4 I think is not a really good idea, especially if you are working on a team or a big project, might work well for small stuff. The reason is simple, you wouldn't really write addIdToObject( ... ). You would normally have that out in a type or an interface, so it would be more like addIdToObject({ ... }), and now if you are using IdType anywhere else in the code, if you change it, you will get all of the errors that you need. However if you have left the type as inferred, you could simply say pass in an extra argument to the function, or remove an argument, and you would never know that you just broke 50 different things until it gets to production and you get angry clients :)
@edgeeffect
@edgeeffect Жыл бұрын
I've been thinking there's something "a bit odd" about `Record` and it's finally dawned on me.... I haven't seen a `Record` keyword since I was programming in PASCAL - and TypeScript was designed by ANDERS HEJLSBERG... oh, I see clearly now! And it's just dawned on me that TypeScript is almost an intersection of 2 of my favourite languages ever... ... ... and that also explains why TypeScript loves PascalCase so much. (Sorry for irrelevant drivel but irrelevant drivel is what I do)
@Mitsunee_
@Mitsunee_ Жыл бұрын
everytime I try to use keyof in generics I end up with it staying at the union type. Yesterday I was trying to merge all my getBundledFooBar functions into a single util and it just never wanted to work for me. Really confused as to what specifically makes typescript understand when a keyof-based parameter is not the union of all keys.
@lamtran6520
@lamtran6520 4 ай бұрын
Question: What is the // ^2 in your code, and why it log the variable all the time ? Is it a plugin or typescript external ?
@joker_j1268
@joker_j1268 3 ай бұрын
Its a VSCode extension. He covered it in this video before: kzfaq.info/get/bejne/q5aRl6512pORk3U.html
@muhammadmejanulhaque3305
@muhammadmejanulhaque3305 Жыл бұрын
I am really glad that I started my javascript journey with Typescript. Thank you so much for the video.
@multigladiator384
@multigladiator384 10 ай бұрын
<a href="#" class="seekto" data-time="814">13:34</a> nice! this is useful stuff
@ricardoislasruiz3186
@ricardoislasruiz3186 Жыл бұрын
Generics are so cool!
@amans6504
@amans6504 Жыл бұрын
Can you do one with axios? I literally get confused using axios with typescript and make my responses and errors typesafe
@AlexKozack
@AlexKozack Жыл бұрын
How to make type argument required? That createSet() should throw a type error about missed type argument?
@mervinmarias9283
@mervinmarias9283 9 ай бұрын
This seems like a more powerful form of destructuring, where instead of presetting the initial values, you enforce the types that should be returned.
My favourite VSCode extension has 3k downloads
2:11
Matt Pocock
Рет қаралды 128 М.
Infer is easier than you think
13:38
Matt Pocock
Рет қаралды 85 М.
버블티로 체감되는 요즘 물가
00:16
진영민yeongmin
Рет қаралды 39 МЛН
Final muy increíble 😱
00:46
Juan De Dios Pantoja 2
Рет қаралды 28 МЛН
TypeScript Wizardry: Recursive Template Literals
14:47
Tech Talks with Simon
Рет қаралды 36 М.
TypeScript Generics are EASY once you know this
22:21
ByteGrad
Рет қаралды 124 М.
Learn TypeScript Generics In 13 Minutes
12:52
Web Dev Simplified
Рет қаралды 224 М.
Reviewing your React Code: Episode #3
14:27
Youssef Benlemlih
Рет қаралды 3,4 М.
5 Good Python Habits
17:35
Indently
Рет қаралды 389 М.
Rust Functions Are Weird (But Be Glad)
19:52
Logan Smith
Рет қаралды 127 М.
TypeScript generics или универсальный типы, обобщения
23:51
Михаил Непомнящий
Рет қаралды 33 М.
Most TS devs don't understand 'satisfies'
4:10
Matt Pocock
Рет қаралды 53 М.
I Cannot Believe TypeScript Recommends You Do This!
7:45
Web Dev Simplified
Рет қаралды 161 М.
Работяга попал в ад #фильмы #сериалы
0:56
ВКРАТЦЕ
Рет қаралды 1,5 МЛН
Волк подружился с человеком #фильм #кино
1:00
МеткийДик
Рет қаралды 1,1 МЛН
Ultra Meme Mashaa 😱😱😱 (Animation Meme) #memeanimation
0:10
Crazzy Toon
Рет қаралды 12 МЛН
FLUTESHAKE 3
0:34
FluteDude
Рет қаралды 12 МЛН