Тёмный

Stop Using {} In TypeScript 

Web Dev Simplified
Подписаться 1,6 млн
Просмотров 351 тыс.
50% 1

🌎 Find Me Here:
My Blog: blog.webdevsimplified.com
My Courses: courses.webdevsimplified.com
Patreon: / webdevsimplified
Twitter: / devsimplified
Discord: / discord
GitHub: github.com/WebDevSimplified
CodePen: codepen.io/WebDevSimplified
#Shorts

Опубликовано:

 

16 авг 2023

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 194   
@1DrowsyBoi
@1DrowsyBoi Месяц назад
Type-safe language programmers: "Look what they need just to mimic a fraction of our power."
@abhayprince
@abhayprince 9 месяцев назад
I name it key instead of index. { [key:string] : unknown }
@j.r.r.tolkien8724
@j.r.r.tolkien8724 9 месяцев назад
Makes more sense. I thought it had to be named index.
@dorian0623
@dorian0623 6 месяцев назад
I'd also use key or property but index should be just fine as it stands for index signature
@ninhdang1106
@ninhdang1106 5 месяцев назад
Same thing but I use the Record syntax instead. Kinda more pleasing to look at
@idylanxe
@idylanxe 5 месяцев назад
And it works
@Percevaaaal
@Percevaaaal 2 месяца назад
Same here 👌
@devperatetechno8151
@devperatetechno8151 9 месяцев назад
thanks kyle, keep with the snippets of TS
@j.r.r.tolkien8724
@j.r.r.tolkien8724 9 месяцев назад
More please. I'm transitioning to Typescript.
@RonnieMcNutt_Mindblowing
@RonnieMcNutt_Mindblowing 9 месяцев назад
Me watching this even though I know nothing about coding: Very nice
@IAmLesleh
@IAmLesleh 9 месяцев назад
No better time to start
@x3zlo
@x3zlo 9 месяцев назад
​@@IAmLeslehI think this person wants to finish, not start 😏
@graphicdesignandwebsolutio365
@graphicdesignandwebsolutio365 6 месяцев назад
Fuck typescript
@ivansostarec2564
@ivansostarec2564 4 месяца назад
You should try coding
@und0
@und0 6 месяцев назад
you should mention the `object` (note lowercase) this is the most generic pure object you can specify, usually useful it you're extended a generic. function foo (bar: T) { return Object.keys(bar) }
@ffuego9751
@ffuego9751 9 месяцев назад
These shorts are awesome, goat js/ts content creator
@sterin557
@sterin557 9 месяцев назад
Need more typescript stuff
@andrewjarrett132
@andrewjarrett132 8 месяцев назад
Record won't exclude arrays though. If you want to exclude arrays, you'll need to do `Record`. There are a few small corner cases where `Record` is too strict, but those don't come up much in user-land.
@brettchan3572
@brettchan3572 6 месяцев назад
You sure? type personData = Record; // This will cause a TypeScript error because it doesn't match the declared type function f(obj: personData) { return obj; } f(["3"]) // Argument of type 'string[]' is not assignable to parameter of type 'personData'.Index signature for type 'string' is missing in type 'string[]'.ts(2345)
@andrewjarrett132
@andrewjarrett132 6 месяцев назад
I assumed you’d be putting the type in a generic (which is usually what you want - if your use case looks like that, it’s probably fine to just use `object` and allow arrays)
@buddy.abc123
@buddy.abc123 9 месяцев назад
Thank you so much Kyle! I've been struggling to type the ioredis georadius result. This will help me
@dimarak8866
@dimarak8866 23 дня назад
One could just type it like this: type Obj = { name: string; surname: string; }; Record is only needed if you want to build a versatile function that handles different objects with the same structure or if you expect an object from an API f.ex. to change property names in the future
@IStMl
@IStMl 17 дней назад
You can't pass any object with the type you defined. Thats the whole point of this short.
@travispulley5288
@travispulley5288 9 месяцев назад
Super helpful! Relaxes my brain to think of it this way
@thefanboy3285
@thefanboy3285 Месяц назад
The title made me think for a moment there was a trick in TS to get rid of the block scope delimiters "{" "}" lol
@christianpuldon7201
@christianpuldon7201 7 месяцев назад
For a split second I read "Stop using TypeScript"
@cypherusuh
@cypherusuh 7 месяцев назад
this makes TS A LOT more complex than I thought...
@thecoolnewsguy
@thecoolnewsguy 8 месяцев назад
Deno helped me a lot to learn TypeScript and avoid some bad practices such as this one
@nomadshiba
@nomadshiba 8 месяцев назад
also you can do `Record` `PropertyKey` shorthand for `string | symbol | number`
@pavankumard5276
@pavankumard5276 6 месяцев назад
Commenting so that youtube recommends more of these type of shorts❤
@johnsoto7112
@johnsoto7112 9 месяцев назад
I love the record syntax over the 2nd one
@zheil9152
@zheil9152 9 месяцев назад
{} is actually pretty powerful when you want to accept any value that isn’t undefined or null. It’s an any, but that any must exist
@GurjotSingh-no4hx
@GurjotSingh-no4hx 9 месяцев назад
wouldn't the same apply to the 2 alternate solutions he provided?
@3UM6A6BE
@3UM6A6BE 9 месяцев назад
You can make your intention more clear by using NonNullable
@alexcoroza4518
@alexcoroza4518 9 месяцев назад
If you do not want to accept null or undefined then you can configure you typescript's strictNullChecks to true
@zheil9152
@zheil9152 8 месяцев назад
@@GurjotSingh-no4hxno. Record limits the expectation to an object and not any of the aforementioned primitives
@zheil9152
@zheil9152 2 дня назад
@@alexcoroza4518that’s not the point or intent of what I’m saying
@nozomi_tailwind
@nozomi_tailwind 9 месяцев назад
i use the 2nd method cz i can easily understand like writing the object itself
@justindouglas3659
@justindouglas3659 9 месяцев назад
Can you do a typescript tutorial?
@FurryDanOriginal
@FurryDanOriginal 9 месяцев назад
I can recommend Matt Pocock for that.
@justindouglas3659
@justindouglas3659 9 месяцев назад
@@FurryDanOriginal ok thnx do ypu happen to know someone for php. Seems i need to learn it anyway.
@FurryDanOriginal
@FurryDanOriginal 9 месяцев назад
@@justindouglas3659 Unfortunately no. Outside of some basics, I never needed PHP nor was interested in it. But by searching for PHP tutorials you surely should find a lot of creators and just stick to the one who seems to flow with your prefered style of learning the best.
@Me-vc4sf
@Me-vc4sf Месяц назад
​@@justindouglas3659 "php for beginners " from laracast channel one of the best php tutorial ever
@mouloudjmohamed5116
@mouloudjmohamed5116 2 месяца назад
I didn't learn typescript yet , but I can easily understand what did you write, so is it very simple?
@OliverEbsworth
@OliverEbsworth 9 месяцев назад
I use an Interface and mark each things as its type instance objI { name: string, email: string, image: string, } Is this wrong?
@alexcoroza4518
@alexcoroza4518 9 месяцев назад
yeah. in Angular this is how they type things and it should be on most projects using typescript
@OliverEbsworth
@OliverEbsworth 9 месяцев назад
@@alexcoroza4518 cheers man, I appreciate your reply.
@asherrfacee
@asherrfacee 9 месяцев назад
Using an interface/type/class when you are expecting a specific object type is definitely the best option. In the rare case that you want to accept any object except a Date, instead of using his solution, I recommend using a conditional type: function processObjectWithoutDate(obj: T extends Date ? never : T): void { // Process the object // ... }
@risitas5874
@risitas5874 9 месяцев назад
Thanks for teaching me this, although I don't think I will be adopting this pattern. The codebase has to be already be using it
@rtpHarry
@rtpHarry 6 месяцев назад
Great shorts normally but I never bump into this issue, which is confusing as you say "by far the most common issue". If it's being passed like that its normally more defined like as an interface, or as you recommend a type. I never go near the Object type directly.
@abe_is_live
@abe_is_live 29 дней назад
Yea what's the point of using typescript if you don't want to define what the structure looks like lol
@nomadshiba
@nomadshiba 6 месяцев назад
Also you can still use it, its a great way to tell that something is anything but non nullable
@solomonowusu-ansah1751
@solomonowusu-ansah1751 6 месяцев назад
I use the second option. But I've learnt another way. Thanks
@bronzekoala9141
@bronzekoala9141 9 месяцев назад
Nice tip, but how on earth is this the "most common mistake"?? I've never even come into a situation where I could've done this mistake.
@sqfzerzefsdf
@sqfzerzefsdf 9 месяцев назад
@bronzekoala9141 like he said everything inherits from object so there's a lot of potential reason to pass one around and there's plenty of room for mistakes due to how unintuitive something as abstract as object is
@asherrfacee
@asherrfacee 9 месяцев назад
I agree, not a common mistake. I’ve been writing typescript for 10 years. This is a weird niche case where you want strictly compile time type checking for any object except a Date. I say strictly compile time cause you could always use runtime validation for Date very easily which most cases would likely use. His advice to never use object I find to be questionable advice, and his suggested use of the Record utility type is wrong according to the Typescript team. Record should only be used when you want strictly typed dictionary-like object. If you want to exclude date just use a conditional type: function processObjectWithoutDate(obj: T extends Date ? never : T): void { // Process the object // ... }
@birthdayzrock1426
@birthdayzrock1426 Месяц назад
maybe it's really uncommon, but still the most common lol
@pierrehenriot2480
@pierrehenriot2480 9 месяцев назад
Are you Captain Pike's son ?
@AdamLeis
@AdamLeis 8 месяцев назад
I've been all up in Record in the past months. It seems cleaner to my eyes for some reason than the key index approach (2nd version he showed).
@urban8499
@urban8499 9 месяцев назад
Hey thanks , never knew about this
@mystica-subs
@mystica-subs 2 дня назад
What do you mean the object works and the date no longer works? I don't see a difference? Where is the actual output of this code?
@yohanlopes1847
@yohanlopes1847 2 месяца назад
amazing, thanks!
@adityatripathi1904
@adityatripathi1904 9 месяцев назад
Record
@nostalgia5031
@nostalgia5031 Месяц назад
Doing “Record” also works
@IStMl
@IStMl 17 дней назад
did you not watch the short?
@riacharda
@riacharda 5 месяцев назад
I'm guilty of doing this. Massive thanks 👍🏾
@ilkinismailov4438
@ilkinismailov4438 2 месяца назад
{} means "anything but a `null` or `undefined`"!
@StuartLoria
@StuartLoria 5 месяцев назад
Actually useful, I could use a longer video, interesting topic.
@RS-fz4ps
@RS-fz4ps 13 часов назад
If you knew the desired members of you Param, why wouldn’t you define a class for it instead? Isn’t that the point of typescript?
@mahadevovnl
@mahadevovnl 9 месяцев назад
What about nested objects
@anshXR
@anshXR 9 месяцев назад
bro how u so majestic
@rammahkarpous
@rammahkarpous Месяц назад
Cool, thanks 👌🏾
@meudiariodev
@meudiariodev 9 месяцев назад
What's the name for this? How the folder to put those kind of object factory could be named?
@Bohdan29
@Bohdan29 7 месяцев назад
This won't work if you have an object that is declared as an interface.
@IStMl
@IStMl 17 дней назад
just dont mix types and interfaces
@blueghost512
@blueghost512 9 месяцев назад
Which is due to missing tsconfig rules
@T1Oracle
@T1Oracle 7 месяцев назад
My frustration is anytime I use typescript with a 3rd party library with broken, missing, and overly complicated types. Fighting both Typescript and a new library, is too much. I usually give up and revert to "any."
@SRG-Learn-Code
@SRG-Learn-Code 9 месяцев назад
I hope JStypes come soon so we can stop with the TS madness.
@richardflosi
@richardflosi 9 месяцев назад
There is a spec for js comment annotations is the works, but it’s still some that 3rd parties like TS would read for typing.
@chris-zlrr
@chris-zlrr День назад
thats cool
@TheDLK
@TheDLK 8 месяцев назад
What's the difference between using Record & Record ?
@thecoolnewsguy
@thecoolnewsguy 8 месяцев назад
Unknown will throw an error until you check the type. Any will disable type checking and you don't have to check the type before using whatever you want
@Ptaszqq
@Ptaszqq 9 месяцев назад
I haven't seen anyone typing object Object yet
@trFirzen
@trFirzen 9 месяцев назад
I see these videos after I do these mistakes lol. Are you following my code?
@roronoa_d_law1075
@roronoa_d_law1075 9 месяцев назад
Is it possible to have not string keys ?
@asherrfacee
@asherrfacee 9 месяцев назад
Yes, you can also use numbers and symbols: // Using numbers as keys type NumberRecord = Record; const numberObject: NumberRecord = { 1: "One", 2: "Two", 3: "Three" }; // Using symbols as keys const symbolKey1 = Symbol(); const symbolKey2 = Symbol(); type SymbolRecord = Record; const symbolObject: SymbolRecord = { [symbolKey1]: 42, [symbolKey2]: 99 };
@donnyp7350
@donnyp7350 9 месяцев назад
Thankss
@valcubeto
@valcubeto 11 дней назад
Why unknown instead of Any
@timothyhoytbsme
@timothyhoytbsme 5 месяцев назад
What about nested objects?
@gronkhfp
@gronkhfp Месяц назад
Or just create an Interface for your models
@btoann
@btoann 9 месяцев назад
This one doesnt work with interface. I have googled for some solutions, but almost of it are recommended replace type instead or using Record which i see no different from Object/any. Does anyone have another idea!?
@asherrfacee
@asherrfacee 9 месяцев назад
You should only use Record utility type when you want a strictly defined dictionary-like object, so his solution is more of a hack. In his example, it’s a simple case where you want to just exclude the Date type, so using a simple conditional type to exclude Date is the best option: function processObjectWithoutDate(obj: T extends Date ? never : T): void { // Process the object // ... }
@sciencemommy
@sciencemommy 9 месяцев назад
Thanks!
@Naej7
@Naej7 9 месяцев назад
You look like a Meghan Markle copycat
@WebDevSimplified
@WebDevSimplified 9 месяцев назад
You are very welcome!
@cbbcbb6803
@cbbcbb6803 2 дня назад
An object should be an object! What?
@Lucas-mu5no
@Lucas-mu5no 6 месяцев назад
Awesome
@pixelotetm
@pixelotetm 9 месяцев назад
That record is the same as Map< String, dynamic> in dart programing, actually for dart to be able to work with Json, it needs to be converted to a Map of Strings keys and dynamic values
@asherrfacee
@asherrfacee 9 месяцев назад
If you want a custom type for representing JSON objects in typescript, that provides additional type safety then I recommend the following: type JSONValue = string | number | boolean | null | JSONValue[] | Record;
@zack2415
@zack2415 8 месяцев назад
Why not use an interface ?
@JohnCostanzo
@JohnCostanzo 9 месяцев назад
I think biggest mistakes is not properly setting up a tsconfig.
@kleinertraitor
@kleinertraitor 9 месяцев назад
hey kyle, whats the difference between unknown vs any?
@bowiemtl
@bowiemtl 9 месяцев назад
They are like the exact opposites. Any allows any operation because it could be anything, unknown allows none without narrowing down the type. It’s better to read the documentation and code examples to really get the gist of it
@cafelutsa_
@cafelutsa_ 9 месяцев назад
Please stop producing videos with the format of "Stop doing X thing"
@TheSaintsVEVO
@TheSaintsVEVO 9 месяцев назад
Elaborate
@cafelutsa_
@cafelutsa_ 9 месяцев назад
@@TheSaintsVEVO Elaborate on what?
@samipplays
@samipplays 9 месяцев назад
Everybody seems to like it tho
@pepperdayjackpac4521
@pepperdayjackpac4521 9 месяцев назад
Why?
@TheCroninberg
@TheCroninberg 9 месяцев назад
​@@pepperdayjackpac4521as it gets more views/ more people are curious
@alexcoroza4518
@alexcoroza4518 9 месяцев назад
why not use interface?
@biyrololo
@biyrololo 9 месяцев назад
What if {name: string} ?
@low_scarlet
@low_scarlet 9 месяцев назад
why not interface?
@ayandhara
@ayandhara 9 месяцев назад
but {} gives me error every time !!
@a7mooz
@a7mooz 9 месяцев назад
I use lowercase 'object' cuz it's simpler
@MarcinCebula
@MarcinCebula 7 дней назад
You could do that...but...should you? you can `typeof ` an object or create a class. At this point you might as well just say `any`
@preciouschidi5131
@preciouschidi5131 9 месяцев назад
Hello Kyle you have been of a great help to me in the last few years as a self-taught developer. Right now I need a job. It has been a real issue for me. I have been a developer of self, building projects for clients as a freelance but I really want to go out of this shell and work in real life company. This is a great problem for me. Please I need your help.
@darkenblade986
@darkenblade986 8 месяцев назад
Actually the most common would be doing front end dev 😂
@thecoolnewsguy
@thecoolnewsguy 8 месяцев назад
Agree 😢😢 especially CSS
@vishnuvardhan.s
@vishnuvardhan.s 9 месяцев назад
I am having a scenario where key and value is always string but for a specific string "foo" the value is a number. How can i do this with Record?
@helloworlditsworld
@helloworlditsworld 9 месяцев назад
Replace the string with “foo” and unknown with number
@sidthetech7623
@sidthetech7623 9 месяцев назад
Stackoverflow has entered the chat.
@sevenstars0711
@sevenstars0711 9 месяцев назад
{ [index:string]: unknown, “foo”: number } this should work or maybe you have to reverse their order
@Dev-Siri
@Dev-Siri 9 месяцев назад
Record & { foo: number; }
@sevenstars0711
@sevenstars0711 9 месяцев назад
@@Dev-Siri rightttt, i learned yesterday about record, it seems very useful
@Kareszrk
@Kareszrk 4 месяца назад
Why do you say that is a key/index? I thought that is called property.
@birthdayzrock1426
@birthdayzrock1426 Месяц назад
key is same as property
@Kareszrk
@Kareszrk Месяц назад
​@@birthdayzrock1426Oh, alright. Thank you for the clarification! ❤
@josephnguyen1549
@josephnguyen1549 8 месяцев назад
Damn I make this mistake 😂
@mr.k8660
@mr.k8660 6 месяцев назад
why is frontend only writen in js why couldn't it be writen in like python or rust...
@IStMl
@IStMl 17 дней назад
Writing frontend in Rust would be a nightmare
@coleykat312
@coleykat312 9 месяцев назад
What is the difference between JavaScript and typescript
@asherrfacee
@asherrfacee 9 месяцев назад
TypeScript is like an enhanced version of JavaScript. It adds optional static typing to catch errors early, improves coding tools, helps maintain clean and documented code, supports modern features before they’re available in all browsers, and boosts code quality.
@awekeningbro1207
@awekeningbro1207 9 месяцев назад
Doesn't {} mean empty object?
@asherrfacee
@asherrfacee 9 месяцев назад
Using {} as a type does not represent an empty object. Instead, it represents a type that matches any object shape. In other words, it’s a type that allows for any properties and values. If you’re specifically looking to represent an empty object type, you can use Record or {} along with as const for stricter type inference. Here’s an example: // Using Record const emptyObject1: Record = {}; // Using {} with as const const emptyObject2 = {} as const;
@azeek
@azeek 5 месяцев назад
Cuz in reality you don't want an object you want smth like a dictionary.
@benji9107
@benji9107 5 месяцев назад
An object... That wasn't too hard
@richardflosi
@richardflosi 9 месяцев назад
What happens after you compile it to js?
@Kiev-en-3-jours
@Kiev-en-3-jours 9 месяцев назад
Probably a big mess.
@asherrfacee
@asherrfacee 9 месяцев назад
They are types, so they are removed when it is compiled to js.
@markdesign1354
@markdesign1354 9 месяцев назад
wow, typescript is so complicated and non-intuitive.
@rico5424
@rico5424 5 месяцев назад
I hate typescript so EXTRA
@waffle8364
@waffle8364 5 месяцев назад
I type script but it's a necessary evil I suppose
@Darkpill-2
@Darkpill-2 8 месяцев назад
JavaScript has bigger problems than type checking. This is why projects are starting to dump typescript.
@asherrfacee
@asherrfacee 9 месяцев назад
Date is an object, most people want it as an object. This is an interesting case where want to exclude Date. According to the Typescript team, you should only use Record utility type when you want a strictly defined dictionary-like object, so your use case here is more of a hack imo. I recommend using a simple conditional type: function processObjectWithoutDate(obj: T extends Date ? never : T): void { // Process the object // ... }
@thecoolnewsguy
@thecoolnewsguy 8 месяцев назад
Ay man this is so unreadable
@asherrfacee
@asherrfacee 8 месяцев назад
@@thecoolnewsguy This is a niche case when you want to accept all types except for a single type, therefore “T extends ? never : T” is exactly the type of readable logic you would want. It doesn’t rely on any unintended behavior to work. It works for multiple cases, not just for Dates. And this is the recommended approach from the Typescript team.
@sidthetech7623
@sidthetech7623 9 месяцев назад
What we need is a typescript solution... for typescript. And we need more frameworks on top of frameworks on top of frameworks on top of frameworks on top of frameworks. Life feeds on life feeds on life feeds on life feeds on life... You can typescript if you want to. You can leave vanilla js behind... and if your friends dont dance with typescript down their pants, well their no friends of mine. Typesafety Dance 💃 🕺
@inzdvl
@inzdvl 9 месяцев назад
I always love those videos with devs that are spending couple of minutes here and there just to be type safe instead of focusing on the actual code :D. This is priceless…
@Dev-Siri
@Dev-Siri 9 месяцев назад
this comment is harder to discern than trying to find the end of a class name in a java app.
@Naej7
@Naej7 9 месяцев назад
@@inzdvlIf you’ve never had a type error before, you’ve never coded in your life. Also, typing enables autocompletion, so that I can focus on the actual code instead of looking for the documentation every time..
@juraev0056
@juraev0056 9 месяцев назад
​@@Naej7pretty much any editor can do autocompletion without typescript.
@Naej7
@Naej7 9 месяцев назад
@@juraev0056 How is the editor supposed to know the type of a parameter in a function if the type is not explicitly written ?
@hetuman
@hetuman 8 месяцев назад
well date type is Object.... typeof new Date()
@thecoolnewsguy
@thecoolnewsguy 8 месяцев назад
He literally said that lol
@peterveliki7918
@peterveliki7918 9 месяцев назад
Why not stop using TypeScript in the first place ? :D
@br3nto
@br3nto 9 месяцев назад
Why bother with types of you’re going to do this?
@gro967
@gro967 5 месяцев назад
Most basic Ts knowledge. Do people not read docs?
@oogabooga2581
@oogabooga2581 9 месяцев назад
I've never wasted so much time in my life until i was introduced to a TS codebase. What a huge fk around, enjoy writing union types for something as basic as API responses, when JS has the dynamic typing and, OR functionally already built in.. Cant believe people are keeping this up - let it die with coffeescript
@rosonowski
@rosonowski 9 месяцев назад
Stringly typed. 😁
@rajeevpurohit23
@rajeevpurohit23 9 месяцев назад
What if the object has different types, not just string and value but Boolean or array
@7DuRd3n
@7DuRd3n 9 месяцев назад
stop using typescript
@Vichion
@Vichion 6 месяцев назад
"As you can see".... As I can see what? Your face? Remove it from the shorts format and utilize the space better. I'm not angry, just dissapointed.
@tienanhemho
@tienanhemho 4 месяца назад
Stop using {}: ❌ Stop using Typescript: ✅
@TheGrandChieftain
@TheGrandChieftain 9 месяцев назад
Nice to know what Record does now, but I’d still rather catch this error at runtime. The fact that you had to use a date object shows how niche it is.
@asherrfacee
@asherrfacee 9 месяцев назад
His use of Record is more of a hack. You should use Record when you want a strictly defined dictionary-like object. I use it all the time as dictionaries are very useful. His example i agree is very niche, and I would most likely just use runtime validation to prevent a Date object from being passed. But if for some reason you really wanted to accept any object type except a Date then you could use a a conditional type to exclude Date: function processObjectWithoutDate(obj: T extends Date ? never : T): void { // Process the object // ... }
Далее
2000000❤️⚽️#shorts #thankyou
00:20
Просмотров 10 млн
Anchor Is The Best New CSS Feature Since Flexbox
1:00
Просмотров 319 тыс.
How To Make Toggle Button Using HTML & CSS
5:27
Просмотров 64 тыс.
Prettify for Classes
0:46
Просмотров 93 тыс.
Maps Are A Game Changer For JavaScript
1:00
Просмотров 763 тыс.
Type Predicates Solve This Common TypeScript Error
5:01
The most common TypeScript error
0:59
Просмотров 68 тыс.
7 Awesome TypeScript Types You Should Know
8:57
Просмотров 76 тыс.