v1Installation cargo add tauri@1 cargo add specta@1 cargo add tauri-specta@1 --features javascript,typescript Adding Specta to custom types use specta::Type; use serde::{Deserialize, Serialize}; // The `specta::Type` macro allows us to understand your types // We implement `specta::Type` on primitive types for you. // If you want to use a type from an external crate you may need to enable the feature on Specta. #[derive(Serialize, Type)] pub struct MyCustomReturnType { pub some_field: String, } #[derive(Deserialize, Type)] pub struct MyCustomArgumentType { pub foo: String, pub bar: i32, } Annotate your Tauri commands with Specta #[tauri::command] #[specta::specta] // <-- This bit here fn greet3() -> MyCustomReturnType { MyCustomReturnType { some_field: "Hello World".into(), } } #[tauri::command] #[specta::specta] // <-- This bit here fn greet(name: String) -> String { format!("Hello {name}!") } Export your bindings use specta::collect_types; use tauri_specta::{ts, js}; // this example exports your types on startup when in debug mode or in a unit test. You can do whatever. fn main() { #[cfg(debug_assertions)] ts::export(collect_types![greet, greet2, greet3], "../src/bindings.ts").unwrap(); // or export to JS with JSDoc #[cfg(debug_assertions)] js::export(collect_types![greet, greet2, greet3], "../src/bindings.js").unwrap(); } #[test] fn export_bindings() { ts::export(collect_types![greet, greet2, greet3], "../src/bindings.ts").unwrap(); js::export(collect_types![greet, greet2, greet3], "../src/bindings.js").unwrap(); } Usage on frontend import * as commands from "./bindings"; // This should point to the file we export from Rust await commands.greet("Brendan"); ## Events To have typesafe events, you must use [Tauri Specta v2](./v2.md)!Edit on GitHubLast updated on PreviousOverviewNextv2