←back to thread

Parse, Don't Validate (2019)

(lexi-lambda.github.io)
389 points melse | 7 comments | | HN request time: 1.027s | source | bottom
1. mirekrusin ◴[] No.27640199[source]
In typescript parsing/asserting types with combinators works very well merging runtime with static type system [0], it has to be used at i/o boundary, then it enters static type system guarantee and no assertions are necessary, makes very nice codebase.

[0] https://github.com/appliedblockchain/assert-combinators

replies(1): >>27640428 #
2. lloydatkinson ◴[] No.27640428[source]
I wish it had actual proper examples. I've no idea how to use that.
replies(3): >>27640723 #>>27642258 #>>27642707 #
3. uryga ◴[] No.27640723[source]
from a look at the readme, you combine those `$.TYPE` things to build a validation function that checks if its argument matches some pattern (and throws an exception if it doesn't).

  import * as $ from '@appliedblockchain/assert-combinators'

  const validateFooBar = (
    $.object({
      foo: $.string,
      bar: $.boolean
    })
  )
  // probably roughly equivalent to
  /*
  const validateFooBar = (x) => {
    console.assert(
      typeof x === 'object' &&
      typeof x.foo === 'string' &&
      typeof x.bar === 'boolean'
    )
    return x
  }
  */


  const test1 = { foo: "abc", bar: false }
  const test2 = { foo: 0, quux: true } 
  const { foo, bar } = validateFooBar(test1) // ok
  const oops = validateFooBar(test2) // throws error
the source is pretty readable too if you want to get an idea how it works.

https://github.com/appliedblockchain/assert-combinators/blob...

https://github.com/appliedblockchain/assert-combinators/blob...

replies(1): >>27661606 #
4. hermanradtke ◴[] No.27642258[source]
Check out https://github.com/gcanti/io-ts/blob/master/index.md instead. I find it more composable and you can define a codec and get a native type from it so you are only defining things once.
replies(1): >>27642689 #
5. mirekrusin ◴[] No.27642689{3}[source]
Assert combinators are composable, light, terse (very little verbosity), types can be defined in single place, instead of type/interface definition you can use return type of assert function.

They don’t go into deep category theory, you won’t find monads and friends, they are first level, straightforward any typescript developer can pick up in minutes - this is by design. It stops at combinators in typescript to solve very specific problem and nothing more. Haskell in ts is not the goal of this npm.

6. mirekrusin ◴[] No.27642707[source]
Thank you, you are right. I’ll add examples and ping here.
7. mirekrusin ◴[] No.27661606{3}[source]
Yes, the difference between console.assert and assert-combinators is that assert combinators return well typed ts result (and are more terse/minimal).