Object

Object is very easy to confuse with the use of Class. Unlike Class you can’t assign function or method to Object.

lib.rs
#[napi(object)]
pub struct Pet {
  pub name: String,
  pub kind: u32,
}

Any impl block of this struct will not affect the JavaScript Object.

⚠️

If you want to convert a Rust struct into JavaScript Object using #[napi(object)] attribute, you need to mark all of its fields as pub.

Once struct is marked as #[napi(object)], you can use it as a function argument type or return type.

lib.rs
#[napi(object)]
pub struct Pet {
  pub name: String,
  pub kind: u32,
}
 
#[napi]
fn print_pet(pet: Pet) {
  println!("{}", pet.name);
}
 
#[napi]
fn create_cat() -> Pet {
  Pet {
    name: "cat".to_string(),
    kind: 1,
  }
}
⚠️

The JavaScript Object passed in or returned from Rust is cloned. This means any mutation on JavaScript Object will not affect the original Rust struct. And any mutation on Rust struct will not affect the JavaScript Object either.