inspectable

預設情況下,從 Rust 匯出的結構體會變成具有單個 ptr 屬性的 JavaScript 類別。所有其他屬性都實作為 getter,這些 getter 在呼叫 toJSON 時不會顯示。

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 結構體的所有可讀取欄位。