From the documentation of ReScript React, I can declare a component like this:
module OptionalChildren = {
@react.component
let make = (~children: option<React.element>=?, ~children2: React.element=?) => {
<div>
{switch children {
| Some(element) => element
| None => React.string("No children provided")
}}
{switch children2 {
| Some(element) => element
| None => React.string("No children provided")
}}
</div>
}
}
Both children and children2 evaluate to option<React.element> type? So, what's the difference? Is latter just the short form of former?
The first form is explicit, since children will actually be an option<_>. The second form will emit the warning:
React: optional argument annotations must have explicit
option. Did you meanoption(React.element)=??
The word "must" is a bit odd, since clearly it does compile without it. But I believe the motivation for it is type annotation accuracy, to avoid confusion. For example, what if your intention is actually option<option<React.element>>? How would you interpret seeing just option<React.element>?
Note also that it's possible to provide a default argument, ~children: React.element=React.null for example, which adds to the complexity of the construct.