- Correctness: The software does what it's supposed to do, i.e., reflects its design
- Flexibility: The software is easy to modify as the design (requirements) change
- Make design explicit with types
- Compositionality
We can think of our software as derived from a design. There's several ways to check if our code matches our design, ordered in the image depending on how close they are to the design or code levels.
- Explicit design with types
- Compositionality
- Brief history of JS and TS
- Basic JS and TS types
- Functions
- Immutability
- Implementing map, filter, reduce
- Currying
- Compose
- Pipe and flow examples
- Combinators
- Exercises
- Recursion
- TS type system: structural vs nominal, soundness vs completeness, variance
- Sum and product types
- Nominal types and smart constructors
- Advanced TS types
- Contracts
- Property-based testing
- ADTs - Maybe