Skip to content

Repository files navigation

Tsify-next

Tsify-next is a library for generating TypeScript definitions from Rust code. The original Tsify appears to be in hypernation mode, so this for incorporates updates until main Tsify project comes back to life.

Using this with wasm-bindgen will automatically output the types to .d.ts.

Inspired by typescript-definitions and ts-rs.

Example

Click to show Cargo.toml.
[dependencies]
tsify = "0.4.5"serde = { version = "1.0", features = ["derive"] }
wasm-bindgen = { version = "0.2" }
use serde::{Deserialize,Serialize};use tsify::Tsify;use wasm_bindgen::prelude::*;#[derive(Tsify,Serialize,Deserialize)]#[tsify(into_wasm_abi, from_wasm_abi)]pubstructPoint{x:i32,y:i32,}#[wasm_bindgen]pubfninto_js() -> Point{Point{x:0,y:0}}#[wasm_bindgen]pubfnfrom_js(point:Point){}

Will generate the following .d.ts file:

/* tslint:disable *//* eslint-disable *//** * @returns {Point} */exportfunctioninto_js(): Point;/** * @param {Point} point */exportfunctionfrom_js(point: Point): void;exportinterfacePoint{x: number;y: number;}

This is the behavior due to typescript_custom_section and Rust Type conversions.

Crate Features

  • json (default) enables serialization through serde_json.
  • js enables serialization through serde-wasm-bindgen and generates the appropriate types for it. This will be the default in future versions.

Attributes

Tsify container attributes

  • into_wasm_abi implements IntoWasmAbi and OptionIntoWasmAbi. This can be converted directly from Rust to JS via serde_json or serde-wasm-bindgen.
  • from_wasm_abi implements FromWasmAbi and OptionFromWasmAbi. This is the opposite operation of the above.
  • namespace generates a namespace for the enum variants.

Tsify field attributes

  • type
  • optional

Serde attributes

  • rename
  • rename-all
  • tag
  • content
  • untagged
  • skip
  • skip_serializing
  • skip_deserializing
  • skip_serializing_if = "Option::is_none"
  • flatten
  • default
  • transparent

Type Override

use tsify::Tsify;#[derive(Tsify)]pubstructFoo{#[tsify(type = "0 | 1 | 2")]x:i32,}

Generated type:

exportinterfaceFoo{x: 0|1|2;}

Optional Properties

#[derive(Tsify)]structOptional{#[tsify(optional)]a:Option<i32>,#[serde(skip_serializing_if = "Option::is_none")]b:Option<String>,#[serde(default)]c:i32,}

Generated type:

exportinterfaceOptional{a?: number;b?: string;c?: number;}

Enum

#[derive(Tsify)]enumColor{Red,Blue,Green,Rgb(u8,u8,u8),Hsv{hue:f64,saturation:f64,value:f64,},}

Generated type:

exporttypeColor=|"Red"|"Blue"|"Green"|{Rgb: [number,number,number]}|{Hsv: {hue: number;saturation: number;value: number}};

Enum with namespace

#[derive(Tsify)]#[tsify(namespace)]enumColor{Red,Blue,Green,Rgb(u8,u8,u8),Hsv{hue:f64,saturation:f64,value:f64,},}

Generated type:

declarenamespaceColor{exporttypeRed="Red";exporttypeBlue="Blue";exporttypeGreen="Green";exporttypeRgb={Rgb: [number,number,number]};exporttypeHsv={Hsv: {hue: number;saturation: number;value: number}};}exporttypeColor=|"Red"|"Blue"|"Green"|{Rgb: [number,number,number]}|{Hsv: {hue: number;saturation: number;value: number}};

Type Aliases

use tsify::{declare,Tsify};#[derive(Tsify)]structFoo<T>(T);#[declare]typeBar = Foo<i32>;

Generated type:

exporttypeFoo<T>=T;exporttypeBar=Foo<number>;

About

A library for generating TypeScript definitions from rust code.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages