You are currently looking at the v11.0 docs, which are still a work in progress. If you miss anything, you may find it in the older v10.0 docs here.
Bind to JS Object
JavaScript objects are a combination of several use-cases:
As a "record" or "struct" in other languages (like ReScript and C).
As a hash map.
As a class.
As a module to import/export.
ReScript cleanly separates the binding methods for JS object based on these 4 use-cases. This page documents the first three. Binding to JS module objects is described in the Import from/Export to JS section.
Bind to Record-like JS Objects
Bind Using ReScript Record
If your JavaScript object has fixed fields, then it's conceptually like a ReScript record. Since a ReScript record compiles to a clean JavaScript object, you can definitely type a JS object as a ReScript record!
External is documented here. @module
is documented here.
If you want or need to use different field names on the ReScript and the JavaScript side, you can use the @as
decorator:
This is useful to map to JavaScript attribute names that cannot be expressed in ReScript (such as keywords).
It is also possible to map a ReScript record to a JavaScript array by passing indices to the @as
decorator:
Bind Using ReScript Object
Alternatively, you can use ReScript object to model a JS object too:
Bind Using Special Getter and Setter Attributes
Alternatively, you can use get
and set
to bind to individual fields of a JS object:
You can also use get_index
and set_index
to access a dynamic property or an index:
Bind to Hash Map-like JS Object
If your JavaScript object:
might or might not add/remove keys
contains only values that are of the same type
Then it's not really an object, it's a hash map. Use Js.Dict, which contains operations like get
, set
, etc. and cleanly compiles to a JavaScript object still.
Bind to a JS Object That's a Class
Use new
to emulate e.g. new Date()
:
You can chain new
and module
if the JS module you're importing is itself a class: