This question is in the context of a component that is transpiled for use in the browser.
Consider a variant definition in wit:
variant my-variant {
typea(string),
typeb(list<u8>),
}
I notice that when js bindings are generated for this, we get an object with a variant-like shape:
{
tag: "typea"
val: "some_value"
}
An option
is, according to these component-model docs, semantically equivalent to the variant:
variant option {
none,
some(ty),
}
Therefore, I think I should expect that if a function returns an option<string>
according to wit
, that generated js bindings would unpack the object into a javascript object with a particular "optional" structure, such as:
{
tag: "Some"
val: "some_value"
}
or
{
tag: "None"
}
I would prefer this!
But instead, in this option<string>
example, we would simply either get a result of type string | undefined
. This seems incorrect to me. Shouldn't undefined
be reserved for uninitialized variables and the like, rather than the None case of a valid response?
Open to hearing some alternative opinions here.
Thanks,
James
The mapping of the very common variants option and result to Java script uses a special representation as the more idiomatic way: option uses null for none, result an exception for error. Both provide the happy path value directly.
Last updated: Dec 23 2024 at 12:05 UTC