about the episode
about the guests
Brian Douglas: Welcome to another installment of JAMstack Radio. On the line we've got Josh Goldberg of Typescript fame. Josh, hello.
Josh Goldberg: Hey, what's up? How's it going?
Brian: It is a pleasure. I've got a full cup of coffee here in my Someone Loves You In Oakland mug.
Josh: Oh, it's beautiful.
Brian: Yeah, yeah. It's-- Basically we decluttered our mug situation because that's the one thing that gets out of hand in our cupboards. But this one made it.
Josh: Oh no.
Brian: But speaking of made it, you made it on the podcast. It was a ping and a followup with a DM saying, "Hey, you should come talk about Typescript here on JAMstack Radio." So why don't you introduce yourself, tell us who you are, what you do and how you got here?
Josh: Sure, I'll start with two things. First, thank you for having me, I'm really excited to be here. Second, we are about to move but otherwise would be going through a mug cleanup. We no longer can fit all of our mugs into the dedicated mug cabinet, so it's really annoying. I don't want to get rid of any of them, I feel your pain.
But hey, everyone. I'm Josh Goldberg. I'm a full time Open Source developer, meaning I work on Open Source software instead of having a job, which is fun. I used to have jobs, I worked at Code Academy and previous to that, Microsoft. But nowadays I tend to do a lot of work on Typescript ESLint which is the tooling that let's you run ESLint on Typescript and a few other Open Source projects.
In general, I also stream on Twitch, talk at conferences and I recently wrote a book, Learning Typescript. If that's a thing you want to do and you like reading books, then I would recommend mine, it's good for that. Am I missing anything?
Brian: I don't know, I'm learning a lot about you just now. I didn't even know you were full time Open Source either, so what projects are you working on?
Brian: Wow, nice.
Josh: It sounds great, it's a literally unsolvable problem so it's kind of an approximate tool but it's really exciting.
Brian: Yeah. It just pushes you in the right direction, you still got to do some cleanup after the fact?
Josh: Yeah, for sure. There's no codebase that's sensibly written out in beautifully predictable types, everything has some weirdness to it.
Brian: All right. Well, I look forward to proving you wrong one day. Not today. None of my code is in that place.
Josh: Eventually, we all aspire to be there by the time we retire. One of these days.
Brian: Yes, exactly.
Josh: But yeah, those are the two main ones and then I have random other side projects. I have this library that hooks up with the Konami code in your browser to little fireworks of emojis exploding on the page that I'm trying to get sites to use as an Easter Egg. But those are the main one.
Brian: Cool, yeah. We'll circle back on the Open Source thing, but I wanted to actually just... Can we set the stage and say what is Typescript?
If you ever use JSDoc, little /** comments on top of things to declare what they do and their types, it's just the types portion of that. And because it let's you declare types, it then enables a whole bunch of awesome features like really good editor tooling that let's you to go to definition, find all references, do refactor stuff like that.
Brian: Excellent, yeah. How long have you been in the Typescript space? Because we can do a little bit of storytelling, I'm curious as to where did you inject yourself in the story?
Josh: I started, I think, in maybe 2014 or so. Maybe 2015.
Now, fast forward to this point for, man, math, six years later, seven years later, now I totally get it. I got it for libraries, being able to when you export stuff, doing this sort of integration with VS Code, you identify, "Okay, this is what the API is going to give you. This should be a string, whatever." But now I get it even more, where I just know my site is going to run. If I deploy it, I know it's going to run consistently and there's not a weird, undefined issue somewhere, which has plagued my React code for years.
Josh: Same, yeah. Typescript has got a lot more powerful over the years. Fun fact, it actually was first made available publicly in 2012. There are so many features of Typescript now that seem incredibly important and essential, that you wouldn't be able to use Typescript effectively without, but a lot of them came out in the last few years.
I also kind of miss the time when everything was in flux, is it going to be Flow or Typescript or whatever? Flow is still around, most Open Source projects don't use it, Facebook's Meta still uses it, I guess. It's apparently an excellent language.
One of the other Typescript ESLint maintainers actually is at Meta and I believe either works on or heavily with Flow and is in love with the language for many good reasons that I don't know. But yeah, Typescript has gotten really good and I'm excited that it's become the standard for enterprise apps the last few years.
Brian: That's interesting to hear too as well, because I love the fact that it's still alive and well, because I'm also a GraphGo user and Relay is an excellent tool. Relay has advanced by so much further than so many other tools, consumer GraphQL. But it's an Open Source project and it's mostly used only by Facebook at this point, or the Facebook team inside of Meta.
Yeah, it's one of those things, maybe it was just too soon for us because I was a huge Relay fan, and same thing with Flow. We actually started using Flow when I was early days at Netlify, as a test. It became more of an annoyance for us, so we ended up ripping it out, but we tested it in a few different places, tested Typescript, and made the ultimate decision like, "Lets not move forward at that time with something."
I don't know if we were recording at this point, but it's the difference between starting with Typescript versus bolting it on after the fact in a legacy app is a completely different experience. So I'm just curious if you could further comment on that?
Josh: Yeah, I think that was before we were recording. Yeah, Typescript is very different as an experience.
I think the two polar opposites I see people go through is their first Typescript experience when they have a large app which was not designed to be type safe, when it has what I would consider to be architectural defects. Type safety is not a thing unique to Typescript, it's not like you convert to Typescript and now you care about the types of your code. Typescript is just exposing the value types, the things that were already there in your codebase.
So if it's hard to type your code in Typescript these days, it might be that your code is just weird and wacky and hard to conceptualize. So you start off with a codebase that is older, pre Typescript and you yourself don't know a lot about Typescript, that is just a heck of an experience in positive and negative ways, right?
It's a good learning experience. But then the other side is you know Typescript now and you either start from scratch or join a project that is made for Typescript with type safety in mind, with modern principles, and it's just a pleasure. It's a real breeze, right? You've been doing Typescript recently and I'm guessing, has your experience gotten more positive as you've gained familiarity in codebases?
Brian: Oh yeah, once I stop avoiding it. So my introduction to Typescript as of recent, so a couple years ago GitHub had a bunch of third party libraries like ProBot, very Typescript heavy, a lot of their earlier GitHub actions, examples were all Typescript heavy so I knew it from... If somebody had already set it up, I'm like, "Okay, I'll just make it work."
Actually it's a good rails, I don't know if rails is a good term, but basically guardrails to add new code or adjust code or leverage the library. But as of recent, OpenSauced had a rewrite to go directly... it's one of those things where it was a meme, where people would try, they would open an issue and be like, "This project doesn't have Typescript. Issue, convert project to Typescript." It's like, "Okay, cool."
Josh: Oh boy.
Brian: If you want to do that, feel free, create another branch, but try to keep up while we're still shipping more features. So that was one of those things that it was not obtainable to convert legacy projects to Typescript without halting production altogether. But we did it, we did it in OpenSauced because we had a project that was feature complete, it was a web app that was getting contribution but it got a slowdown, one of my contributors were like, "Hey, I converted everything to Typescript."
I was like, "Cool, let's get it merged, let's try it out." And it was nice, it was actually really nice to interact with. We converted another project to Typescript and I started learning Typescript based on those two projects as I was contributing. I kept doing everything wrong and then just this week I realized that we had this singular indexed .DTS file that had all of our interfaces and types in there, and I was like, "Oh, that makes so much more sense. We can just import from here and then we can pass this around to even new projects."
And then everything just clicked, and I was like, "Oh, this is extremely valuable because we're building the same stuff over and over again in multiple projects. We could just have this file walk around with us and share this thing."
Josh: That's beautiful. Out of curiosity, one of the features that Typescript has gotten much better at over the last few years is incremental conversions. They support Allow JS, which allows you Include JS, even Check JS. Did you experiment at all with partial conversions, one file at a time type stuff?
Brian: Is it common for folks to even approach converting Typescript projects from JS to Typescript nowadays? Are people seeing the value?
Josh: I think so. I think the Typescript evangelism has won pretty heavily. Typescript, like every technology, goes through a hype cycle where people get really excited at first and then they all hate it because they try it out and have found the flaws, and then it plateaus to a reasonable level. I think we've hit the reasonable level for Typescript, I think the term is Gartner Hype cycle. I've been using it.
Typescript is really good once you have more than a few files, and it's kind of annoying if you don't know it well and/or you only have one or two files. So people I think have stopped getting annoyed at it for not being a great experience on their tiny, little Node apps, but enough of us have fixed and/or found bugs at scale by converting to Typescript, that we've realized like you said, this is the way now, this is the right thing.
So I'm not doing async stuff, I should be, and that was the fix. But it was that moment where the data that I'm trying to get from the API is undefined, so what do I do with that? Well, I should probably instead of checking a type for undefine, which is probably a code smell, we actually have a Is Loading type, which is a Boolean. So if the Boolean for Is Loading is true or false, that works, and then if it's True we don't even attempt to fetch the data or put the data on the page.
So now we've circumvented the undefined, but I wasn't pushed in this direction until my types were like, "Hey, guess what? There's a possibility this is undefined. What are you going to do about it?" It's prodding me and telling me to do something better.
Josh: I love it. That's the startup Ah Ha Moment that everyone is going for. And actually tying back to the history of Typescript, I think people have gotten much better at understanding how to market Typescript, in large part because we understand much better what it's really good for.
Then a lot of people started resenting Typescript, "Oh, are we just a bunch of Java programmers now? Classes?" But now we advertise Typescript as, "Oh, it'll find you bugs, it'll help you develop." These really key, useful things, that if Typescript were a startup these would be the bullet points just above the call to action on the homepage.
Brian: I was just having a conversation with Theo who's running Ping.DG. He's a big Typescript fan, a big TRPC fan and he had mentioned in passing, he's like, "If you have Typescript, you don't need Unit Test." And I'm actually testing that theory right now in my project, as I'm going through my unit tests and when I'm actually testing, that also backs up with types. I'm on the fence on it at the moment. But I do feel a lot more confidence even when I don't have tests, because I have types.
Josh: Yeah. Theo is a fantastic individual with great opinions. This is one of the opinions where I see its value on certain types of projects, especially if it's the type of project you can easily end to end or integration test. But I don't agree with it as a blanket statement, and I think it's... I don't want to say harmful, I think that's more accusatory than I'm trying to come across here, that we are.
But I think the marketing can confuse people when you say, "Typescript replaces the need for unit tests," because a lot of people, especially new folks in tech, they just take what they're saying online as an opinion and go with it. Typescript can't always replace, most of the time I don't think it can replace well written, logical unit tests. Sometimes maybe.
But I don't want people to think that Typescript is a replacement for it. In my experience it works best as a trim down where you don't have to unit test dumb stuff, "What if we pass undefined? What if we pass null to this thing?"It really just verifies your types, it doesn't check for application correctness.
Brian: Yeah. A lot of my libraries, and this is actually where I got my teeth cut on Typescript, is I have these lib folders. It's the utils, the functions folder that you pass around. In the context of OpenSauced, we show GitHub stars and GitHub stars can be in the tens of thousands, hundreds of thousands, or it could be like 1, 2, 3. We have this one function that takes the number and humanizes it.
So taking 10,000 stars and make it 10K instead, basically add the K to the end of the 1,000 mark. It's just a practice I learned in displaying data on the page. I haven't put it on NPM because I just basically copy and paste it everywhere. I should probably share it as a cool, little tool for anybody. But there's other solutions people can use. What I'm getting at is I ended up adding types to that, and then I wrote tests for that.
Then I think to your point, I don't need to test for undefined, or I don't need to test to see if this thing is a string. If it's a string or if it's a number, I can already coerce it into what I need it to be so I can stop testing that. But then I can test what happens if it's a million, what happens if we get a bazillion stars. What does that look like?
So I can test those bigger edge cases, functionality as opposed to... And that's the unit testing I expect to do when I walk through my... I don't need to do TBD all the time, but for small things like this, I'll start with a test and then try to get it to work. TBD is an old habit that I pull out every now and then when I want to feel cool on livestreams.
Josh: Oh, you livestream TBD? That's intense.
Brian: It's been a while, but yeah. Every now and then if I'm feeling dangerous, we'll start with a test.
Josh: I love it. Yeah, I think it's unfortunate that types and tests both begin with the letter T because I have been playing around with the idea of types driven development where you write the types first and then the code to satisfy it. It's not unique to me, other people have mentioned this, and I think both are pretty awesome ways of doing things if you can both remember and force yourself to do them right.
That's such a great example of a unit test, by the way. Plus one to you, that's something where both Typescript helps you not have to satisfy or test for silly edge cases, but is also something that that's an application correctness concern like what do you do at 12 million or whatnot?
Brian: Yeah. I guess it's funny, because I haven't been full time coding for a long time. I just recently got back into writing code full time over the summer, and yeah, it's just one of those practices as a junior engineer years ago, I kept writing dumb stuff and I kept getting pushback on how useful, how not useful this stuff is because it just becomes a code smell or whatever.
There are other languages like Reason and is it Rescript now? Or was? I forget. And Helm, that are supposed to be fantastic, but they don't have a lot of adoption because they don't interact super well with your existing application. So I don't see Typescript going anywhere. Long term, like years and years and years from now when Wasm can directly manipulate DOM and all these other wacky things have happened, then maybe not.
But all I see on job boards are enterprise, Typescript, new startup, Typescript, mid scale business, Typescript. Everyone is using Typescript, and those who aren't are oftentimes trying to use Typescript. So yeah, I'd say go for it. You don't need to know it, there are a bajillion things you can learn in tech, and within that in web. But no, it's top of the pile. I've been wanting to learn TRPC, I just keep not having the time to do more than the Hello World. That looks fantastic too.
Brian: Yeah. That's the thing, I don't know how long it's been around. It's one of those technologies that I'm still waiting for the infancy to die off a bit, because I've definitely adopted GraphQL, being one of them. I've adopted a couple different tools early on in its infancy, and then get burned on just trying to keep up while I'm also trying to do some other stuff. So TRPC is something on my list of things to implement in my new projects moving forward, but I don't have any new projects yet. I'm still trying to get this current one shipped.
Josh: For sure. By the way, good luck on that. I'm very excited about OpenSauced, signed up. There's also a really interesting parallel between how... It's weird calling GraphQL old. I remember a time ago when it wasn't old. But slightly older approaches like GraphQL to slightly newer ones like TRPC, TRPC almost assumes that you're using Typescript, the way it's setup. Maybe you can use it with vanilla JS, but it's so much better with TS, and that's an assumption that would not have flowed at all, like five years ago.
People would've confused it, or thought of it as a niche library. But now because so many people are using it in the way it's meant to be used, with Typescript, with a fully typed application, it's so much more powerful and amazing, and you can get all these great features from its dev experience. It's really cool. It's where the industry is going I think.
Second of all, things today are so nice compared to how they used to be for tooling. You can just startup a new Remix or Next project in like, what? 30 seconds? Whatever the Yarn install time is. Beautiful. So my prediction is we'll keep going higher in the stack, higher, better abstractions that make you take less time and code to do the common things. Medium term.
Brian: Yeah. I think it's C# based.
Josh: Wait, I actually love this. I've been getting into OBS, I only relatively recently started understanding anything with streaming and that's such a cool idea. I had no idea it had a V8 shenanigan in there, though. That's awesome.
Just like what the web did, or even things like Next did to the React ecosystem, or what jQuery did to the frontend. It's basically giving you an abstraction that you can interact with, without even needing to know what's happening in the Chrome tab. I think that future is what I look forward to, you can go through a boot camp and start shipping production code for Twitch or for Facebook or whatever.
Josh: Yeah. So many companies for years and years, one of their biggest dev problems which I'm sure you, as a dev advocate person have seen a lot of is, "Well, once you finish your three week intensive training to learn how to ship code to internal QA and then the other two weeks for production, then you're ready to go." That's the length of an internship for some people. But now with code spaces and Next JS and all these other fancy innovations, yeah, plus one. It's really exciting. Velocity.
Brian: Yeah, yeah. Absolutely amazing and exciting. We're almost approaching time, so I could probably talk forever about this subject but I do want to go back into your really quick conversation about your Open Source work and how you got into Open Source full time. How did you basically make the plunge to say, "You know what? This insolent Typescript stuff, this is what I want to do with my free time, we're going to figure out how to pay the bills"?
Josh: First of all, shout out to my spouse, Mariah, who I'm picking off of for health insurance. Without her health insurance I would probably not be doing this. But I've always really had a passion and excitement and enthusiasm for nitpicking at enterprise scale, as I call it. I like taking a piece of code and being able to tell as much information about it as soon as possible. I don't like having to wait until I've hit some 14 mysterious commands to get this onto a production website before I can really debug it.
So getting that live feedback and telling me, "Oh, you caused a bug here because you created a promise and never awaited it or whatever," that to me is a beautiful thing. We were talking about primitives, every low level thing helps improve the higher stuff above it. The further down you go in the primitive layers, if you're talking about Typescript rather than, say, React or NextJS above that, then you can really make a large impact with every change you make.
So between really enjoying the work and feeling very positive about the scale of impact, I just loved it. I started with TSLint, which for those who don't remember, is a Linter that was like ESLint for Typescript, it was Typescript native. It had a couple problems with it. One, it was made by Palantir which is a company that a lot of people don't feel comfortable taking code from, so even though it was Open Source and I was never employed or paid by Palantir, that was still a thing.
The second is that TSLine is not the same as ESLint, so any time anyone wrote anything for one, we'd then have to port it to the other and ESLint was way more popular so it was just not as good on TSLint. So after TSLint got deprecated and Typescript ESLint became the standard tooling, that's after a while where I started helping out with maintenance.
I also do a lot of random other things like contributing to Typescript itself, which is actually really fun and I'd highly recommend. So I just did more and more over time until eventually I realized I don't really want a full time job. I miss parts of it like having coworkers and mentors and mentees, but Open Source just makes me happy. I feel like I'm doing good work.
Brian: Excellent. Yeah, looking forward to chatting more about your Open Source journey and I'll definitely give you a sneak peek of the OpenSauced platform that we'll be shipping in a few weeks. So folks, definitely follow me on Twitter, follow OpenSauced on Twitter if you want more details on that. But with that, I wanted to transition to picks.
So there's a lot of nonprofit sites that were built in whatever web framework of choice, and they recently converted Youarerad.org, which is a... Sorry, I'm not going to pitch the actual nonprofit well, but basically they provide mental health services or streamers and gamers and E sports folks. Yeah, it's built in NextJS, they wanted to update to be able to provide extra features on their site.
The Open Source Rig Guild actually got together and converted the entire project to Typescript. It's a group of 20 people, just attacking the problem all at once. Pretty cool, check it out. The other pick I want to mention is I actually just got a new car and it's the Tesla Model Y. I waited 10 months for this thing. It was more of like a spur of the moment, it was like, "I know I'm going to get a new car. I know I don't want a gas car. What are the options? Let me just go ahead and put a pre order on a Tesla Model Y because I watched a YouTube video."
Lo and behold, 10 months later it's like, "Hey, your car's ready." I completely gave up hope on this thing because of all the shortages. I actually really like the car. Actually, Josh, have you been inside of a Tesla?
Josh: I don't think I have, actually, in my life. No.
Brian: Okay, yeah. For whatever reason, Ubers and Lyfts, they're all Teslas now. I think because of gas prices. So I got to ride in quite a few Ubers and Lyfts locally. Yeah, I'm a big fan. I've got a lot of friends who have Teslas. The price point is slightly high, it's a lot higher than the one I pre ordered a year ago, so definitely pay attention to the price.
But yeah, I ended up getting the blue, Model Y, long range model. The inside is almost as if you're driving inside of an iPhone, basically, if I explained that correctly. It's super limited situation, no bells and whistles, except a giant iPad-like screen in the middle that does everything for you.
The thing that's concerning, I guess my review, is every now and then if it's too cold outside at night the screen sometimes freezes so I have to hold the two buttons on the steering wheel to refresh it and I've probably done that like 10 times since I got the thing two months ago. So that's a little interesting, but luckily I know how to use an iPhone and I know how to refresh devices.
Josh: That's scary. Do you worry about that happening at an inopportune moment?
Brian: Yeah, the car still works. It usually happens when I first start it, so if it's frozen I'll just refresh it before I hit the road. It's never frozen mid drive or anything like that. But the only thing that I think shut down is your turn signal. I don't know, maybe I'm just exposing this stuff for whatever the safety regulations.
But the turn signal and stuff like that doesn't work when it's refreshing the screen. Everything else works, you can still drive the car no problem. You just don't have your speedometer, you can't see your speedometer and you can't use a turn signal.
Josh: That only makes me feel a little better, but I'm glad it's not quite as bad.
Brian: Yeah, I don't have the full self driving. I don't agree with that, so that's a scary thing. Everything else is pretty cool.
Brian: Excellent, yeah. Jacob who runs this organization, this little group. He's a gamer himself, he likes esports and things like that so he set it up in a way that's just like raiding, if you play Starcraft or whatnot, or World of Warcraft, League of Legends. I don't know all the games that are out there. You usually have a group that you get together and you all attack a problem or attack a boss the same time, and Typescript has been their recent boss. Which I love the concept so much that I'm looking forward to partnering with them with OpenSauced in the future.
Josh: That's awesome. I like the description of Typescript as boss also, it's a nice, little bonus.
Brian: Yeah, excellent. Do you have any picks for us?
Josh: I do. I have a couple of picks. One, DocuSource which is a lovely... I don't even know how to describe it. It calls itself a docs site generator, akin to Next JS or Remix but for static sites, so maybe closer to Gatsby. But it's also just really good for static sites in general. LearningTypeScript.com, shout out, buy it and rate five stars, is built on DocuSource. TypeScriptESLint.IO is built on DocuSource.
They just had a 2.0. It's fantastic, they do so much stuff for you. It somehow at the same time is also super configurable, so it feels seamless when you're just getting something spun up quickly where you just want to write a few markdown files and have a really good looking doc site. But then also if you want to auto generate those files or have tables of whatever based off of them, it's also doable. So shout out. They, congrats, had a 2.0 release recently.
Brian: Nice. Yeah, we were using DocuSource for Docs.OpenSauced.Pizza as well. Wonderful service. I knew the original team that put them together inside of Meta, and happy that this thing is still going along.
Josh: Also, wonderful URL. Oh, there it is. You can sort of tell now when a site is DocuSource. I think it's good, it's nice to standardize. They're also super accessible if I need help, which is hard to find in smaller, less maintained projects. So it's really nice to have a solid, really good doc site on the web.
Brian: Yeah. We actually have a GitHub action because DocuSource, it's structured the same way, the generation. There's a GitHub action that exports your DocuSource site into a PDF. So if you wanted to turn your docs into a book, you could pretty easily.
Josh: That's so smart. I would love that. It would be cool to have a book version, a service worker PWA version, you could install. I remember at Code Academy we made a PWA version of the Code Academy site, which is a little silly because you need an online service to execute a lot of the environments. But it's still very nice, at the very least for performance, just to not have to load pages when you load pages.
Anyway, my second pick is Notion and Obsidian. I use Notion personally. People keep telling me to use Obsidian, and I will eventually. But yeah, Notion, it's like Google Sheets and Docs/Word Web and Excel Web and whatever. They had kind of like a mark down, newer version come out so you can make documents and then each document can have just regular text, bold emojis, little call outs and quotes, but then you can also embed tables with sorting and filtering and formula equations.
I do everything in Notion now, I plan my vacations, we're moving to Philadelphia soon, my moving schedule is a formula sheet on Notion based off of where different items are in the move in the original house. Very exciting stuff. Then Obsidian is like that, it's either Open Source or more self hosted based. I forget exactly. Okay, there you go. You've used these things before.
Brian: Yeah. I've used it from somebody else at Netlify, they're a big fan, and did a whole Learn With Jason about it. That's where I learned of how it works. I actually started using it, but anyway, I was going to recommend my other thing but I'll save that for a future pick. I use a similar tool, but it's quite different.
Josh: Oh, similar but quite different. I'm excited to learn this in the future.
Brian: Yeah. Anyway, we'll just add another pick. Why not? StashPad, StashPad. I started using Notion and then because for the show notes for anybody who's ever been here on this podcast knows, I use PaperDocs out of inertia. I started using it like eight years ago, just kept doing it. But for any sort of engineering, trying to keep historical record of how I approached a problem or my to do list in my 101s with my coworkers and stuff like that, I put it into a StashPad.
Just like Git Stash, very similar. That's my new tool. But I didn't want to supersede your Notion pick, because I'm also a big fan of Notion as well. It's a rabbit hole you can get into, linking stuff together.
Josh: Talking about primitives, in 10 years this will have been a solved problem with two or three major, main players. But for now, this is wonderful, these are all different and beautiful. Their landing page has deep sea creatures on it. This is awesome. Thank you for the pick.
Brian: Excellent. Well, with that, those were our picks. Josh, thanks so much for catching me up with the world of Typescript. I'm actually going to pick up your book, to be quite honest. I love having hard copies. Actually I have a bunch of Manning and O'Reilly books right behind me, so yeah, I just love having the book, laying on the couch, scrolling through ideas. Maybe pulling up a laptop next to it. But yeah, going to definitely check out the book. Remind me, the book is Learning Typescript?
Josh: Yes. And it's LearningTypescript.com, with or without a hyphen.
Brian: Perfect. Well, with that, going to check that out. And listeners, keep spreading the Jam.