Ectype : Types in Vanilla Js

Types In js with out transcompilation and new language overhead
Ectype : Types in Vanilla Js

Let me walk you through a talk. https://gitlab.com/dejawu/ectype is an amazing project

We have all struggled with a JS for almost 3 decades. Big Dream is a better language with types and nice features but we are all locked in a backward-compatible trap.

Fists and quite common idea was to create a new language with all cool features that trapspiled to JS. Coffescript was a pioneer that actually created a movement that transformed Javascript into ES6 language.

The continuation for this concept was a babel and now it is a Typescript and Rescript. This approach has a few downsides

  • Overhead of transpiration
  • need to learn new language and new syntax
  • as side effect new and complex tooling and infrastructure
    • editors
    • compilers
    • bundlers and source maps
  • challenge with debugging and diagnostics

Ectyps take an elegant and different approach. So we have 2 kind of problems:

  • some behavior that we like to add to a language
    • types
    • variant and sum types
    • dependent and conditional types
  • some behavior that we want to avoid or disallow
    • scoping
    • type coercion
    • broken equality
      image

Additive behavior could be added in a lisp or racket style with a flavor of language-oriented programming. So we add a language features as a library and set of functions. unfortunately javascript is not lisp or Racket so it means that language designers couldn’t add a syntax or change a syntax. This means that we pay the extra cost with more verbose language. Substractive behavior could be added via linters and preprocessors. So we lint code before and runtime keeping in mind that the linter made his part of the work https://gitlab.com/dejawu/ectype is a combination of type library and a linter that works together. The biggest beauty - it is all native and vanilla Javascript.

image

Data Types

All data types are set of primitive types

  • Null - you could avoid null but you need it for backward compatibility
  • Bool
  • Num
  • Str

Complex Types

  • struct
  • array
  • fn
  • tuple
  • variant

image

Variants - make Js rusty

one of the biggest features - we could make javascript more rusty with sum types and even introduce pattern matching. image One more side effect of subtypes - now you could avoid a NULL and undefined and all this horrible multimillion mistakes in a code with Rust like Option and Result type

const MaybeStr = variant({
  Some: Str,
  None: Null,
});

const someStr = MaybeStr.from({ Some: "abc" });

// Type-checking should fail when a handler is missing.
someStr.match({
  Some: fn([Str], Null).from((s) => {
    return null;
  }),
});


Conditional Types

It is a minimal implementation of dependent and value aware types that give you the possibility to lift logic and constraint checks to a type itself image

const Email = cond(Str, (val) => {
  return val.includes("@");
});

Static and runtime checks

It is reusable and common way to describe and use a type information for static and runtime checks

image

To learn more watch a talk and try to play with projects


Write a comment
No comments yet.