Result<T, JsValue>

T parameter &T parameter &mut T parameter T return value Option<T> parameter Option<T> return value JavaScript representation
No No No No No Yes Same as T, or an exception

The Result type can be returned from functions exported to JS as well as closures in Rust. Only Result<T, JsValue> is supported where T can be converted to JS. Whenever Ok(val) is encountered it's converted to JS and handed off, and whenever Err(error) is encountered an exception is thrown in JS with error.

You can use Result to enable handling of JS exceptions with ? in Rust, naturally propagating it upwards to the wasm boundary. Furthermore you can also return custom types in Rust so long as they're all convertible to JsValue.

Note that if you import a JS function with Result you need #[wasm_bindgen(catch)] to be annotated on the import (unlike exported functions, which require no extra annotation). This may not be necessary in the future though and it may work "as is"!.