In this episode, Adam talks to Gary Bernhardt about building Execute Program, why he chose to build it as a full-stack TypeScript application, and the implications using TypeScript has on what you need to test.
Why Gary decided to write Execute Program as a full-stack TypeScript application instead of using a Ruby or Python backend like he may have traditionally
Do you actually have to write less tests if you have a good type system?
What does a good type system give you that tests can't give you?
Using io-ts to type check incoming data
How to think about structuring your code to best take advantage of the benefits your type system gives you and minimize the need to write tests
Pushing conditional logic to the core of your system to reduce the number of tests you need to write at the edges
The correlation between type errors and behavioral bugs, and how a type system can help you catch mistakes you don't think to test for
Do type errors signal that you're missing a test?
Structural vs. nominal type systems, and the benefits of structural type systems like used by TypeScript and Go
Best practices for type-checking within a function in a structural type system like TypeScript
The power of supporting literal types like true or "active" in addition to traditional types
Supporting the show: I decided to stop taking sponsors for the show because I think advertisements are annoying and no one wants to listen to them.If you do want to support the show, the best way to do it is to purchase one of my products:
Tailwind UI, a collection of professionally designed, fully responsive HTML components built with Tailwind CSS.
Refactoring UI, a book and video series I put together with Steve Schoger on designing beautiful user interfaces, without relying on a designer.
Test-Driven Laravel, a massive video course on designing robust Laravel applications with TDD. Learn how to build a real-world application from scratch without writing a single line of untested code.
Refactoring to Collections, a book and video course that teaches you how to apply functional programming principles to break down ugly, complex code into simple transformations — free of loops, complex conditionals, and temporary variables.