inspectable

默认情况下,从 Rust 导出的结构体变成具有单个 ptr 属性的 JavaScript 类。 所有其他属性都实现为 getter,调用 toJSON 时不会显示这些 getter。

inspectable 属性可以在 Rust 结构体上使用,以提供 toJSONtoString 实现,从而显示所有可读字段。例如

#![allow(unused)]
fn main() {
#[wasm_bindgen(inspectable)]
pub struct Baz {
    pub field: i32,
    private: i32,
}

#[wasm_bindgen]
impl Baz {
    #[wasm_bindgen(constructor)]
    pub fn new(field: i32) -> Baz {
        Baz { field, private: 13 }
    }
}
}

提供以下行为,如这个 JavaScript 代码片段中所示

const obj = new Baz(3);
assert.deepStrictEqual(obj.toJSON(), { field: 3 });
obj.field = 4;
assert.strictEqual(obj.toString(), '{"field":4}');

这些实现中的一个或两个可以根据需要被覆盖。 请注意,生成的 toString 内部调用 toJSON,因此覆盖 toJSON 将作为副作用影响其输出。

#![allow(unused)]
fn main() {
#[wasm_bindgen]
impl Baz {
    #[wasm_bindgen(js_name = toJSON)]
    pub fn to_json(&self) -> i32 {
        self.field
    }

    #[wasm_bindgen(js_name = toString)]
    pub fn to_string(&self) -> String {
        format!("Baz: {}", self.field)
    }
}
}

请注意,console.log 的输出将保持不变,并且在浏览器中仅显示 ptr 字段。 建议在这些情况下调用 toJSONJSON.stringify 以帮助进行日志记录或调试。 Node.js 不会受到此限制,请参阅下面的部分。

Node.js 中的 inspectable

当使用 nodejs 目标时,会提供额外的 [util.inspect.custom] 实现,该实现内部调用 toJSON。此方法用于 console.log 和类似函数,以显示 Rust 结构体的所有可读字段。