A small library that translates the types from Rust
to TypeScript
for better integration for the invoke
function from Tauri
.
Tauri Types
to your project.sh
cargo add tauri-types
```rust use tauri_types::TauriType;
struct User { name: String, username: String, password: String, age: u32, } ```
That's going to generate this in your tauri-types.ts
file.
ts
export type User = {
name: string;
username: string;
password: string;
age: number;
};
You can use the type by importing it from the tauri-types.ts
file.
ts
import { type User } from './tauri-types';
tauri_types::command
macro above any function you want to export.```rust
fn getuser() -> User { return User { name: "Marko".tostring(), username: "Maki325".tostring(), password: "YoullNeverGuessIt".tostring(), age: 20, } } ```
(You can export it with use tauri_types::command;
, but it's better to use it this way, so it doesn't collide with the command
macro from tauri
.)
tauri::generate_handler
macro with tauri_types::generate_invoke
.rust
...
// .invoke_handler(tauri::generate_handler![
.invoke_handler(tauri_types::generate_invoke![
get_user,
])
.run(tauri::generate_context!())
.expect("error while running tauri application");
...
invoke
from the tauri-types.ts
, instead of directly from tauri
.ts
// import { invoke } from '@tauri-apps/api/tauri';
import { invoke } from './tauri-types';
invoke
.You will need to always use the second argument, even if it's undefined
. I'm still trying to figure out a way to disable that, but for now just set it to undefined
.
Example: ```ts import { invoke } from './tauri-types';
async function main() { // This WILL give a typescript error, for now // const user = await invoke('get_user');
// This WILL work fine const user = await invoke('get_user', undefined);
console.log('User:', user); }
```
namespaces
:```rust
struct User { name: String, username: String, password: String, age: u32, } ```
That's going to generate this in your tauri-types.ts
file.
ts
export namespace db {
export type User = {
name: string;
username: string;
password: string;
age: number;
};
}
If the type you want is in another namespace
or you want to explicitly type it to something else, you can use this feature.
```rust
fn get_username( #[path = "db.User"] user: User ) -> String { return user.username; } ```
If the type you want is in another namespace
or you want to explicitly type it to something else, you can use this feature.
```rust
fn getuser() -> User { return User { name: "Marko".tostring(), username: "Maki325".tostring(), password: "YoullNeverGuessIt".tostring(), age: 20, } } ```
If there are any issues, open one in the Issues
tab on GitHub.
Just be sure that there isn't one like yours already opened!
This is a very side project for me, but I'll try to keep it working.