Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Typelevel Programming Fun in TypeScript

Typelevel Programming Fun in TypeScript

Milano TS

June 13, 2018
Tweet

More Decks by Milano TS

Other Decks in Programming

Transcript

  1. Il TypeLevel programming Il TypeLevel programming non produce codice non

    produce codice JavaScript JavaScript può invece effettuare può invece effettuare ulteriori check ulteriori check a compile-time a compile-time
  2. Perchè farlo? Perchè farlo? TypeSystem più cosciente delle nostre logiche

    significa più errori a compile time, meno a runtime
  3. Perchè farlo? Perchè farlo? TypeSystem più cosciente delle nostre logiche

    significa più errori a compile time, meno a runtime e quindi meno issue da risolvere il giorno del deploy
  4. interface MyInterface { a: boolean b: number c: "LOL" [K:

    string]: any // <== // Gli altri devono esservi assignabili } type A = MyInterface["a"] // => boolean type C = MyInterface["c"] // => "LOL" type Pippo = MyInterface["pippo"] // => any
  5. WARNING! WARNING! Highly Experimental Code! Highly Experimental Code! "Qualche feature

    potrebbe cam biare!" Abbassa le aspettative... Ancora un pochino...
  6. WARNING! WARNING! Highly Experimental Code! Highly Experimental Code! "Qualche feature

    potrebbe cam biare!" Abbassa le aspettative... Ancora un pochino... Che basti? Meglio abbondare!
  7. 0

  8. 0 1

  9. type Zero = { isZero: True } type One =

    { isZero: False, prev: Zero }
  10. type Zero = { isZero: True } type One =

    { isZero: False, prev: Zero } type Two = { isZero: False, prev: One }
  11. type Zero = { isZero: True } type One =

    { isZero: False, prev: Zero } type Two = { isZero: False, prev: One } type Succ<N extends Nat> = { isZero: False, prev: N } type One = Succ<Zero> type Two = Succ<One> type Three = Succ<Succ<Succ<Zero>>>
  12. type HListEmpty = { isEmpty: True item: never nextList: never

    } type HListFirstItem = { isEmpty: False, item: I nextList: HListEmpty }
  13. type HListEmpty = { isEmpty: True item: never nextList: never

    } type HListFirstItem = { isEmpty: False, item: I nextList: HListEmpty } type HListItem<I, L extends HList> = { isEmpty: False, item: I nextList: L }