DEV Community

Cover image for ReScript is not there yet
André Slupik
André Slupik

Posted on

ReScript is not there yet

As a fan of ML-inspired languages, I always found ReScript intriguing. With async-await now recently added to the language, is it time for ReScript to shine?

It sure looks enticing:

... you can pick up ReScript and access the vast JavaScript ecosystem and tooling as if you've known ReScript for a long time1

Doesn't force you to search for pre-made binding libraries made by others. ReScript doesn't need the equivalent of TypeScript's DefinitelyTyped.2

What's the goal of this project?
​We aim to provide the best typed language experience for the JavaScript platform.3

Wow, so they provide the best typed language experience for the JavaScript platform, all without the need for pre-made bindings! Let's give it a go!

We quickly hit a wall as we attempt to do the most basic thing possible:

Image description

Hmm.. why is getElementById not on document? What's the type of document?

Image description

This picture is all the ReScript documentation has to say about it. No definition of Dom.document. F12 leads us down a chain of empty type definitions, so Dom.document does look like a simple alias for the JS document, nothing more.

Wait, so I do need pre-made bindings? What happened to "Doesn't force you to search for pre-made binding libraries made by others"?

Enter the rescript-webapi npm package, Bindings to the DOM and other browser-specific web APIs.. I follow the instructions and compiler errors, including one telling me I might have a configuration issue in "bsconfig.json", even though this file is now called "rescript.json". I get that working eventually.

Here's how it looks:

let elem = document->Document.getElementById("id")
// For the uninitiated, -> is the pipe operator.
// a->foo means foo(a)
// a->foo(b) means foo(a, b)
// The above code is therefore equivalent to
let elem = Document.getElementById(document, "id")
Enter fullscreen mode Exit fullscreen mode

You'll notice that document. will bring up no code completion, as it's still basically untyped. I have to know what module and module function to call.

So the IDE won't help me type the right thing, but will it give me good information about the function I'm calling? Not really:

Image description

For reference, here's TypeScript out of the box:

Image description

Informative error, link to examples, detailed type definition. Thank you. This saves me time, effort, teaches me right as I type - this is one of the main reasons I like static typing. I'm just not getting this with ReScript.

If interacting with the DOM - the reason why JavaScript was created - is not deemed important enough to warrant built-in bindings, I think I've seen enough.

Is ReScript ready in 2024? No. Its official documentation makes lofty promises that seem outright misleading. I guess ReScript can be useful if you will write a lot of ReScript code that mostly interacts with other ReScript code. But one cannot simply ignore "the vast JavaScript ecosystem". Imagine F# without support for the BCL. Luckily, F# and its tooling were designed to consume C# types and documentation seamlessly. Surely there must be a way to leverage DefinitelyTyped in ReScript. Until ReScript does this, I don't think it can seriously compete with TypeScript.

Top comments (2)

Collapse
 
zth profile image
Gabriel Nordeborn

Hey André! My name is Gabriel, and I work on the ReScript language. I'd just like to say that we're very much aware of the massive pain that is interacting with the DOM right now in the language, and it's something we're going to be actively working on fixing. I fully agree with your points - this should just be there and just work, and the API should be much easier to use and discover.

We recently started a thread on the forums to gather feedback from the community about the current pains around Webapi. Feel free to add your thoughts as well there if you want: forum.rescript-lang.org/t/give-you...

Hope you'll be willing to give us another chance when we've improved the situation.

Collapse
 
sachindra_ragul profile image
sachin • Edited

Hi @zth. I guess the community should provide some easily searchable examples in rescript docs on how to work with Dom.
This would solve the beginner problem until the rescript community solves webapi problem.