如何确保将正确的 HTML 元素从 JavaScript 传递到我的 Rust 函数?

How do I ensure the right HTML element is passed from JavaScript to my Rust function?

如果我用 wasm_bindgen 创建一个接受 HtmlCanvasElement 的 Rust 函数,我如何确保它在到达 Rust 端时失败?

JavaScript:

(async () => {
    const demo = await import('./pkg/demo').catch(console.error);
    demo.setCanvas('Hello Element!');  
})();

生锈:

use wasm_bindgen::prelude::*;
use web_sys::{console, HtmlCanvasElement};

#[wasm_bindgen]
pub fn setCanvas(canvas: &HtmlCanvasElement) {
    //  Why does this even get here? I didn't pass in an HtmlCanvasElement
    console::log_1(&canvas);
}

看起来我正在获取类型 HtmlCanvasElement 但如果我尝试将其用作 HtmlCanvasElement,它没有函数,因为我传递的是字符串实际的 canvas 元素。我希望它在我设置时失败,而不是在稍后尝试使用它时失败。

在 DOM 和 wasm_bindgen 中的 Rust 之间没有太多类型控制。 JavaScript 部分处理从 Rust 中看到的 JsValue.

这意味着您必须自己进行检查转换(或让未来的库或框架为您完成)。

JsCast trait 对此有所帮助。它可以让你这样写,例如:

#[wasm_bindgen]
pub fn setElement(canvas: JsValue) -> Result<(), JsValue> {
    match canvas.dyn_into::<HtmlCanvasElement>() {
        Ok(canvas) => {
            // ...

            Ok(())
        }
        Err(_) => Err(JsValue::from_str("argument not a HtmlCanvas")),
    }
}