An example is worth a thousand words.
This section is dedicated to newcomers trying to figure out general idioms & conventions in Reason and BuckleScript. If you're a beginner who's got a good idea for an example, please suggest an edit!
option
typeoption
is a variant that comes with the standard library. It obviates the need for null values in other languages.
let possiblyNullValue1 = None;
let possiblyNullValue2 : option string = Some "Hello@";
switch possiblyNullValue2 {
| None => print_endline "Nothing to see here."
| Some message => print_endline message
};
type universityStudent = {gpa: float};
type response 'studentType = {status: int, student: 'studentType};
let result: response universityStudent = fetchDataFromServer ();
Assuming you're compiling to JS, of course.
let obj1 = {
"name": "John",
"age": 30
};
/* Compiles to a JS object that looks exactly like what you're seeing */
Note that the above isn't a record; the keys are quoted in string. That's Reason syntax sugar for bs.obj. The type is inferred. Next example explicitly types it.
type payload = Js.t {.
name: string,
age: int
};
let obj1: payload = {"name": "John", "age": 30};
Note that {. name: string, age: int}
is the syntax for a Reason/OCaml object type declaration (not a record!). It's lifted into Js.t
so that BuckleScript sees the whole type and compiles it correctly to a regular JavaScript object. Ordinary, non-lifted OCaml objects are compiled into something else (rarely needed currently).
Assuming the module's called store.js
, and has a default export, plus a method called getDate
.
type store = Js.t {. getDate : (unit => float) [@bs.meth]};
external store : store = "./store" [@@bs.module];
Js.log store;
Js.log (store##getDate ());
option
typeFor a function whose argument is passed a JavaScript value that's potentially null
or undefined
, it's idiomatic to convert it to a Reason option
. The conversion is done through the helper functions in Bucklescript's Js.Nullable
module. In this case, to_opt
:
let greetByName possiblyNullName => {
let optionName = Js.Nullable.to_opt possiblyNullName;
switch optionName {
| None => "Hi"
| Some name => "Hello " ^ name
}
};
This check compiles to possiblyNullName == null
in JS, so checks for the presence of null
or undefined
.