I am definitely biased (being the creator and all), but I like the approach JS Zero[1] is taking. Everything is written in a sound, subset of JavaScript, but you can always use an `assume` tag as an escape hatch, allowing you to write &quot;normal&quot; JavaScript when you really need it.<p>For example, if you&#x27;re reading records from a SQL database, you don&#x27;t have to bother wrestling with the type system – just tell it what your data looks like! :)<p><pre><code>    let Pet = Object.of({ name: String, happiness: Number })

    $assume `fetchPets : (Number) =&gt; Promise( Array(Pet) )`
    function fetchPets (minHappiness) {
      return db(&#x27;pets&#x27;).select(&#x27;*&#x27;).where(&#x27;happiness&#x27;, &#x27;&gt;&#x27;, minHappiness)
    }</code></pre>