as const: the most underrated TypeScript feature

  Рет қаралды 111,123

Matt Pocock

Matt Pocock

Күн бұрын

'as const' is an amazingly useful TypeScript feature that most people still don't know about.
00:00 SO underrated
00:12 Objects are mutable!
01:54 How as const works
02:38 Object.freeze
03:19 Deriving types from as const
04:30 keyof typeof
Become a TypeScript Wizard with my free beginners TypeScript Course:
www.totaltypescript.com/tutor...
Follow Matt on Twitter
/ mattpocockuk
Join the Discord:
mattpocock.com/discord

Пікірлер: 307
@TechnologicNick
@TechnologicNick 10 ай бұрын
You can also use `as const` on individual value literals or use it on template string literals to get all possible strings.
@ElektrykFlaaj
@ElektrykFlaaj 10 ай бұрын
or on array to get a tuple. For instance typeof (["a", 1] as const) is readonly ["a", 1], while typeof ["a", 1] is (string | number)[]
@cool_scatter
@cool_scatter 8 ай бұрын
The template literal trick is mind blowing!
@weirdwordcombo
@weirdwordcombo 10 ай бұрын
Metadata based programming can be very very powerful. It essentially allows you to expand an application by just adding metadata to an object, while also writing less code overall. I have found that old codebasis often have similar and/or duplicate code all over the place, which can be refactored with this metadata based driven approach. Cuts down on TONS of boilerplate.
@leotravel85
@leotravel85 10 ай бұрын
You can also use 'satisfies' with 'as const' to constraint the object typings, like 'as const satisfies Record', its super neat
@Ma1ne2
@Ma1ne2 10 ай бұрын
Damn I needed this so many times and didn't know about it, thanks for sharing.
@willshadow
@willshadow 10 ай бұрын
holy crap I needed this, tysm
@goncaloflorencio6529
@goncaloflorencio6529 10 ай бұрын
Thanks a lot for this longer explanation! I sometimes have a harder time catching up on the really short videos but here I was able to get everything immediately.
@nadavrot
@nadavrot 10 ай бұрын
Excellent video! You often make videos about bleeding edge TS features (that I can’t use yet) or incredibly complex topics (that make me scratch my head) but this video was super accessible and easy to follow! Here’s hoping you will make more mid-level TS concepts videos.
@josephsliman3395
@josephsliman3395 10 ай бұрын
I love your typescript content, thanks
@DulithMutucumarana
@DulithMutucumarana 10 ай бұрын
Awesome! Thanks! works on arrays as well: const abc = ['a', 'b', 'c'] as const; type ABC = typeof abc[number];
@uicornerwithJ
@uicornerwithJ 9 ай бұрын
Thank you sir for this great explanation. I am glad that there are so passionate typescript writers out there like yourself. Just watching this video made me understand the keyof typeof stuff and as const much easier.
@waterbreak
@waterbreak 10 ай бұрын
After watching half of the video, I found an immediate use case in my TS project I'm working on. Great video!
@apina2
@apina2 10 ай бұрын
"const as const" sounds really smart and not ridiculous at all
@zuma206
@zuma206 Ай бұрын
It makes perfect sense within the typescript syntax, and it's relationship with javascript syntax
@hatchibomb
@hatchibomb 10 ай бұрын
Amazing! I needed this earlier today!
@AlessioMichelini
@AlessioMichelini 10 ай бұрын
That's absolutely brilliant! I wasn't super sure what "as const" was doing, thanks for clarifying that!
@Gustavewpm
@Gustavewpm 2 ай бұрын
Amazing video. Such really good pedagogy, loved it, even if I was already very familiar with as const and the other notions sumed up.
@naraksama3903
@naraksama3903 10 ай бұрын
I love as const so much. It gives so much information of the code base you're trying to work with. It's makes localization strings global constants so much more useable.
@scylk
@scylk 10 ай бұрын
Hey can you expand a little bit on that? Sounds interesting
@naraksama3903
@naraksama3903 10 ай бұрын
@@scylk It's very simple. You create an object that basically stores all of your strings and add an handler to dynamically change it based on the users OS language. When you mark those strings as const, TypeScript still sees the values of your default language and it's easier to know what string represents what text.
@mattinpjs
@mattinpjs 10 ай бұрын
This is such a helpful feature. I'll be using this all the time now, thank you
@adi96adi
@adi96adi 5 ай бұрын
Needed this a few months ago 😂 excellent content on this channel dude keep it up
@JDalmasca
@JDalmasca 10 ай бұрын
Just came to say this video finally helped make `as const` click for me. Thanks for the info, Matt!
@DC-xt1ry
@DC-xt1ry 10 ай бұрын
Very nice ticks! keep them comming sensei!
@nixoncode
@nixoncode 10 ай бұрын
i was in a live stream a few days ago on this,learned so much
@brad8961
@brad8961 10 ай бұрын
Videos are very useful and clear, thanks
10 ай бұрын
The best and simplest explanation of "as const"!
@Nabulio85
@Nabulio85 10 ай бұрын
Really great. You are a great teacher 😊 Thx from France.
@ColinRichardson
@ColinRichardson 10 ай бұрын
I use this quite often, I don't think it's underrated, I think other things may just be rated too highly... LOL
@ColinRichardson
@ColinRichardson 10 ай бұрын
PS: Where is the Top hat and Monocle?
@SimGunther
@SimGunther 10 ай бұрын
​@@ColinRichardsonPeople do wear two monocles to make a _spectacle_ for themselves, so now he's just missing the top hat, old chap 🎩
@grandpowr
@grandpowr 10 ай бұрын
Thank you very much Mr Matt!
@giodefreitas
@giodefreitas 9 ай бұрын
This channel is also underrated. awesome video! you just got a new subscriber here
@TheGrandChieftain
@TheGrandChieftain 10 ай бұрын
Was using an enum for a radio group in Zod and discovered this. Never went through the trouble of understanding it, though. Thanks 👍🏿
@aamiramin6112
@aamiramin6112 10 ай бұрын
Amazing so concise and clean.
@melvins126
@melvins126 10 ай бұрын
Made me subscribe. Thank you very much. 👍
@AudaiAlFandi
@AudaiAlFandi 10 ай бұрын
Finally... now I understand it. Thank you Matt.
@rizkyagungprasetyo8293
@rizkyagungprasetyo8293 10 ай бұрын
Sometimes I utilize this tool to manage database names, collections, roles, etc., enabling me to infer values instead of strings :).
@williamlvea
@williamlvea 10 ай бұрын
The biggest issue I've had with 'as const' is that it doesn't play well with libraries. Because of the readonly you'll get into cases where libraries are expected something like string[] and will require casting to mask the readonly. It also doesn't actually freeze the values, which can cause hard to debug bugs
@yoni532s9M5w
@yoni532s9M5w 10 ай бұрын
That's worthy of a medium article mate. Very nice solution to a very popular recurring problem
@DoorThief
@DoorThief 5 күн бұрын
As someone who doesn't know TS and just knows C#, I recoiled slightly when I saw the keyof typeof [] bit But then I remembered reflection is pretty much like that anyways in C#, accessing public (or private) members and the like.
@somewonderfulguy
@somewonderfulguy 9 ай бұрын
Watched small video - huge power acquired. Thank you!
@Rivernile345
@Rivernile345 10 ай бұрын
Wow great video especially as a new typescript developer, I subscribed
@AbWischBar
@AbWischBar 10 ай бұрын
That was a whole lot of fantastic stuff that will immediately be used
@leesasuki
@leesasuki 4 ай бұрын
thank you, you are a life saver!
@ginger-viking
@ginger-viking 10 ай бұрын
I did not know as const prevented the object being changed - thanks!
@stephanfitzpatrick1769
@stephanfitzpatrick1769 5 ай бұрын
Brilliant. Instant follow
@PraiseYeezus
@PraiseYeezus 10 ай бұрын
You guys are lucky I'm dumb, I asked the question that inspired this video :) Thanks for all you do Matt, I learned a whole lot.
@irfanfauzi8704
@irfanfauzi8704 2 ай бұрын
It's ridiculous that I can't expect const as constant value. Love your vids
@wiktorchojnacki9746
@wiktorchojnacki9746 2 ай бұрын
You can, you just need to know what is constant about your value.
@christopheradolphe
@christopheradolphe 3 ай бұрын
Awesome tip here. Thank you @mattpocockuk for sharing this.
@Leon-xg7zj
@Leon-xg7zj 9 ай бұрын
Awesome sharing!
@Hadi-gd7ul
@Hadi-gd7ul 10 ай бұрын
This is so beautiful that i want to cry.
@griffadev
@griffadev 10 ай бұрын
Nice video! Heads up on this format on mobile because there's no KZbin outro, the "suggested video" card appeared whilst you were still coding and blocked the code in video
@robertmengual8357
@robertmengual8357 10 ай бұрын
Great video, typescript is beautiful
@Dmitri_Ivanovich
@Dmitri_Ivanovich 10 ай бұрын
"Object.values on a type level" trick is pretty neat. Thanks!
@PapitaPure
@PapitaPure Ай бұрын
You just saved me wtf. I was looking for a solution like this yesterday
@skandertebourbi357
@skandertebourbi357 10 ай бұрын
Simply a typescript magician
@VolodymyrEisenhorn
@VolodymyrEisenhorn 10 ай бұрын
Just wow. Thank you.
@MightyKingKala
@MightyKingKala 10 ай бұрын
this video is amazing!
@zb2747
@zb2747 10 ай бұрын
I love your videos. Very insightful, fun, and straight to the point
@alexeypetrov8543
@alexeypetrov8543 10 ай бұрын
That's brilliant!
@maxwebstudio
@maxwebstudio 10 ай бұрын
Niiiiice ! I always forget how to target the type of keys and values of objects 😅
@RockTheCage55
@RockTheCage55 10 ай бұрын
Excellent....pretty cool. Thanks....
@thekaasim
@thekaasim 10 ай бұрын
helpful video. thanks.
@Mujahedeen_
@Mujahedeen_ 10 ай бұрын
YOU are the most underrated KZbinr
@user-hk6ns2eg1w
@user-hk6ns2eg1w 6 ай бұрын
Nice!! thanks
@rockNbrain
@rockNbrain 10 ай бұрын
Nice job 🎉
@wattsfield1889
@wattsfield1889 10 ай бұрын
Nice. Theo made a similar video of why Enums are bad. He did something similar like this object as const, but his was a string array as const. And the type Route = typeof routeArray[number]. So the difference is whether or not you want a key name associated with the routes
@olegsbk3562
@olegsbk3562 10 ай бұрын
What do you prefer “as const” or enum in cases like in video?
@dawid_dahl
@dawid_dahl 10 ай бұрын
Awesome explanation, thank you! Do you know if TS typesystem is Turing complete? Like the programming you can do at the type level like that? I bet it is.
@mattpocockuk
@mattpocockuk 10 ай бұрын
It is!
@aram5642
@aram5642 9 ай бұрын
Would you consider making a video/talk about the 'declare' keyword. While lurking into various .d.ts files I can spot all possible combinations of 'declare class', 'declare abstract class' (also: 'abstract class' alone). I have only used declare in typescript playground to mimic the existence of a function to make my types go trhough, but I can't get my head wrapped around real-life usage and how it is different from interfaces. Thanks!
@osamanajjar1934
@osamanajjar1934 10 ай бұрын
Matt the goat!
@lalumierehuguenote
@lalumierehuguenote 10 ай бұрын
Oh cool! I knew it for array to union, but not for object to union. Thanks!
@moneyfr
@moneyfr 10 ай бұрын
You didn't talk about: "as const satisfies Record "
@joaofrancisco5781
@joaofrancisco5781 10 ай бұрын
I started using a lot of "as const satisfies typeX", I'm creating a lib and it's helping me a lot
@lambgoat2421
@lambgoat2421 5 ай бұрын
Finally something from youtube I will actually use
@StephenRayner
@StephenRayner 10 ай бұрын
Beautiful
@mbenlahrech
@mbenlahrech 6 ай бұрын
Now using rust and coming from c this is really funny to me how JS devs (i am a 4 years js/ts dev) go nuts with typing systems
@sc76399
@sc76399 10 ай бұрын
As const is really cool. Didn't know we could do that. Is there not an easier way to get values of an object as a union? Like we have keys of us there not values of
@segen8324
@segen8324 10 ай бұрын
this is beautiful
@Alec.Vision
@Alec.Vision 10 ай бұрын
The thing about 'as const', when not used on type parameters, is that it lies. The runtime object is, in fact, not readonly. You can get the same effect, with added runtime correctness, from Object.freeze. I consider this an extension of the 'One Source of Truth' ethos. 'as const' is, essentially, a type assertion. But I'm %100 guilty of using it everywhere so 🤷
@maxwebstudio
@maxwebstudio 10 ай бұрын
Question : But when compiled, the 'as const' Object won't be frozen to JS i guess. So, if it's for heap memory optimization it is better to freeze the object a long side 'as const', isn't it ?
@sergey_llal6897
@sergey_llal6897 9 ай бұрын
Can we use enum for store routes and avoid create additional types?
@omkarbhale442
@omkarbhale442 10 ай бұрын
Why didnt you use enums for the routes? It looks like you only need one of the three routes at any moment. This particular example doesn't show use of as const i think. (I'm new to typescript so maybe I'm wrong, please correct me)
@programming5274
@programming5274 10 ай бұрын
Right, why prefer the code in the video in place of a string enum? String enums are made for this, and they generate faster and generally smaller JS output. const enum Routes { Home = "/", Admin = "/admin", Users = "/users", }
@programming5274
@programming5274 10 ай бұрын
/* String enum */ const enum Routes { Home = "/", Admin = "/admin", Users = "/users", } const goToRoute = (route: Routes) => { console.log(route); } goToRoute(Routes.Home); console.log("----------------------"); /* as const */ const rts = { home: "/", admin: "/admin", user: "/users", } as const; type Rte = (typeof rts)[keyof typeof rts]; const goToRt = (route: Rte) => { console.log(route); } goToRt(rts.home);
@omkarbhale442
@omkarbhale442 10 ай бұрын
@@programming5274 Yes!
@punsmith
@punsmith 10 ай бұрын
Because Matt has a hate boner for them and prefers magic variables. Sharing a codebase with him can be only the first step of hell.
@oscargm1979
@oscargm1979 5 ай бұрын
@@programming5274 I totally agree yet I supose it is just to show that we have that option too. Imho u end with objects from other devs everytime so maybe u can just put 'as const' on them instead of refactoring to enums other people's job, idk
@rhodler
@rhodler Ай бұрын
Merci !
@shane3744
@shane3744 10 ай бұрын
Nice quick dive into using "as const" with objects! I know it's a useful TypeScript feature when I find myself using it intuitively as I'm coding.
@alexking7684
@alexking7684 10 ай бұрын
Fenomenal! 🎉
@micelumail5829
@micelumail5829 10 ай бұрын
4:05 me knowing new ts magic
@anasalhariri5474
@anasalhariri5474 6 ай бұрын
Good to know thanks for sharing :) Like and new Sub
@Orenrs
@Orenrs 10 ай бұрын
Great video and example. Why not using enum for this case ?
@mattpocockuk
@mattpocockuk 10 ай бұрын
Check my video on enums
@3453wer
@3453wer 6 ай бұрын
@@mattpocockuk checked your vid about enums, so again - why dont just use enum for this case? cause enum with specified values transpiles to a simple obj as you had in your video
@barneylaurance1865
@barneylaurance1865 10 ай бұрын
So if you want as const but you don't want the whole tamale const you can define the internal object first as standard mutable object, and then put it inside in the outer const object. I.e. if you have const deep = { whatever: "/deep/whatever", }; const routes = { admin: "/admin", home: "/", deep: deep, } as const; then routes will be inferred as of type: { readonly admin: "/admin"; readonly home: "/"; readonly deep: { whatever: string; }; }
@AlfredLotsu
@AlfredLotsu 9 ай бұрын
I now understand Rich Harris. We are packing up and moving to Jsdoc
@edgeeffect
@edgeeffect 10 ай бұрын
I first got interested in Typescript just because I thought I'd get type-checking... and weak typing was the 1990's biggest mistake. All of this auto-completion stuff in VSCode came along later as just a delightful extra little gift.
@ThanHtutZaw3
@ThanHtutZaw3 4 ай бұрын
How can I type safe for api end point url for fetch ? Some of them will need query or other will need only body .
@ra2enjoyer708
@ra2enjoyer708 10 ай бұрын
Another trick is `as const` objects somewhat work with built-in methods while almost not losing all type info: ```typescript const ROUTES = { home: "/", admin: "/admin", users: "/users" } as const; // sadly not a tuple of literals, merely an array of literal type union const routeValues = Object.values(ROUTES).map((value) => value); export type IRoute = (typeof routeValues)[number]; export function validateRouteValue(inputValue: unknown): inputValue is IRoute { // have to coerse type there because typescript is iffy with `Array.includes()` // when it's array of string literals return routeValues.includes(inputValue as IRoute); } export function doSomethingFromValue(inputValue: IRoute): void { switch (inputValue) { case "/": case "/admin": case "/users": { break; } default: { throw new Error(`Invalid value "${inputValue satisfies never}"`) } } } ``` Achieves the same result but you also get a validation function which acts as a type predicate. The `doSomethingFromValue()` also shows how literal type unions can be paired with `satisfies` keyword to achieve exhaustive switch cases.
@mattpocockuk
@mattpocockuk 10 ай бұрын
You can use ts-reset to fix that Array.includes issue.
@mananabanana
@mananabanana 10 ай бұрын
"as const or how to implement a real enum in typescript" 😂
@MrTrevorrrrrrrr
@MrTrevorrrrrrrr 10 ай бұрын
I may have agreed, but even better is the new const in generics feature.
@kelvindecosta5350
@kelvindecosta5350 10 ай бұрын
Hey Matt, I've come across a pattern that I think deserves a shorthand: type X = { a: string } | { b : number } // Non discriminated union const x : X = { a: "hello"} const a = !!x && 'a' in x ? x.a : undefined // works fine, but is somewhat verbose. const a = x?.a // errors out because 'a' doesn't exist on type { b: number} Is there a simpler way of picking x.a?
@forivall
@forivall 10 ай бұрын
Search for "ExclusifyUnion", there's a good stack overflow answer with an explanation
@user-qk2nl8lf9y
@user-qk2nl8lf9y 10 ай бұрын
what is the VSCode extension you're using to get the human-readable ts error messages?
@mattpocockuk
@mattpocockuk 10 ай бұрын
www.totaltypescript.com/vscode-extension
@user-qk2nl8lf9y
@user-qk2nl8lf9y 10 ай бұрын
@@mattpocockuk Thanks so much!
@josemfcheo
@josemfcheo 5 ай бұрын
this is awesome
@prashantjoshi6703
@prashantjoshi6703 10 ай бұрын
But what benefit it adds in comparison to string enums?🥺
@scylk
@scylk 10 ай бұрын
Wondering the same lol
@am29d
@am29d 10 ай бұрын
Mind blowing...
@danielratiu4318
@danielratiu4318 5 ай бұрын
How about routes with matching variables like '/users/:id' that match /users/3 ?
@omarkraidie
@omarkraidie 10 ай бұрын
const obj = { username: 'abc', password: 'dce', email: 'fgh', } as const; let a: (typeof obj)[keyof typeof obj]; // Value of an object let b: Exclude; // Exclude a value from an object let c: keyof typeof obj; // Keys of an object let d: Exclude; // Exclude a key from an object
@zuperxtreme
@zuperxtreme 10 ай бұрын
Would an enum work the same?
@punsmith
@punsmith 10 ай бұрын
It would, but Matt has an irrational hatred for them, as seen in one of his videos "Why you shouldn't use Enums". Watch him abuse the concept of Enums and instead using magic variables. Biggest tool I've seen in TS.
@furkan7013
@furkan7013 10 ай бұрын
Anybody knows that translation plugin for error messages ?
@vrtech473
@vrtech473 10 ай бұрын
never knew this 😂😂😂😂 GOAT🎉🎉
@Cahnisama
@Cahnisama 10 ай бұрын
Great... now I have to clean my walls.... you HAD to blow my mind didn't you Matt? sigh... Feedback: at 5:20, you video recommendation thumbnail is covering the code you are still explaining, maybe make an outro?
@lorenzorev
@lorenzorev 4 ай бұрын
Normally I would an enum in this case like "enum routes" and avoid declaring the type. What do you think?
Enums considered harmful
9:23
Matt Pocock
Рет қаралды 194 М.
Generics: The most intimidating TypeScript feature
18:19
Matt Pocock
Рет қаралды 163 М.
OMG🤪 #tiktok #shorts #potapova_blog
00:50
Potapova_blog
Рет қаралды 15 МЛН
Balloon Stepping Challenge: Barry Policeman Vs  Herobrine and His Friends
00:28
Неприятная Встреча На Мосту - Полярная звезда #shorts
00:59
Полярная звезда - Kuzey Yıldızı
Рет қаралды 4,4 МЛН
I’m just a kid 🥹🥰 LeoNata family #shorts
00:12
LeoNata Family
Рет қаралды 7 МЛН
Rust for TypeScript devs : Borrow Checker
8:49
ThePrimeagen
Рет қаралды 214 М.
Infer is easier than you think
13:38
Matt Pocock
Рет қаралды 85 М.
Reviewing your React Code: Episode #3
14:27
Youssef Benlemlih
Рет қаралды 2,5 М.
The Most Important Skill You Never Learned
34:56
Web Dev Simplified
Рет қаралды 157 М.
Object Oriented vs Functional Programming with TypeScript
12:07
Most TS devs don't understand 'satisfies'
4:10
Matt Pocock
Рет қаралды 53 М.
My Favorite TypeScript Tips and Tricks
10:21
Lachlan Miller
Рет қаралды 4,9 М.
The Dangers Of Promise.all()
6:15
Theo - t3․gg
Рет қаралды 66 М.
ПОКУПКА ТЕЛЕФОНА С АВИТО?🤭
1:00
Корнеич
Рет қаралды 2,9 МЛН
Ждёшь обновление IOS 18? #ios #ios18 #айоэс #apple #iphone #айфон
0:57
📦Он вам не медведь! Обзор FlyingBear S1
18:26