#wasm-bindgen #typescript #definition #generate-typescript #ts #type #tsify

tsify-next

Tsify-next 是一个从Rust代码生成TypeScript定义的库

5个版本

新增 0.5.4 2024年8月5日
0.5.3 2024年4月30日
0.5.2 2024年4月12日
0.5.1 2024年4月11日
0.5.0 2024年4月10日

#62WebAssembly

Download history 398/week @ 2024-04-18 486/week @ 2024-04-25 495/week @ 2024-05-02 331/week @ 2024-05-09 450/week @ 2024-05-16 511/week @ 2024-05-23 652/week @ 2024-05-30 510/week @ 2024-06-06 918/week @ 2024-06-13 1206/week @ 2024-06-20 682/week @ 2024-06-27 834/week @ 2024-07-04 936/week @ 2024-07-11 985/week @ 2024-07-18 1713/week @ 2024-07-25 1100/week @ 2024-08-01

4,897 每月下载量
用于 dji-log-parser

MIT/Apache

27KB
325

Tsify-next

Tsify-next 是一个从Rust代码生成TypeScript定义的库。原始的 Tsify 似乎处于休眠状态。此仓库将保持更新,直到主要Tsify项目恢复活力。

使用 wasm-bindgen 将自动将类型输出到 .d.ts

typescript-definitionsts-rs 的启发。

示例

点击以显示Cargo.toml。
[dependencies]
tsify-next = "0.5.4"
serde = { version = "1.0", features = ["derive"] }
wasm-bindgen = { version = "0.2" }
use serde::{Deserialize, Serialize};
use tsify_next::Tsify;
use wasm_bindgen::prelude::*;

#[derive(Tsify, Serialize, Deserialize)]
#[tsify(into_wasm_abi, from_wasm_abi)]
pub struct Point {
    x: i32,
    y: i32,
}

#[wasm_bindgen]
pub fn into_js() -> Point {
    Point { x: 0, y: 0 }
}

#[wasm_bindgen]
pub fn from_js(point: Point) {}

将生成以下 .d.ts 文件

/* tslint:disable */
/* eslint-disable */
/**
 * @returns {Point}
 */
export function into_js(): Point;
/**
 * @param {Point} point
 */
export function from_js(point: Point): void;
export interface Point {
    x: number;
    y: number;
}

这是由于 typescript_custom_sectionRust 类型转换 导致的行为。

Crate功能

  • json(默认)通过 serde_json 启用序列化。
  • js 通过 serde-wasm-bindgen 启用序列化并为其生成适当的类型。这将是未来版本的默认值。

属性

Tsify容器属性

  • into_wasm_abi 实现 IntoWasmAbiOptionIntoWasmAbi。这可以通过 serde_jsonserde-wasm-bindgen 直接从Rust转换为JS。
  • from_wasm_abi 实现 FromWasmAbiOptionFromWasmAbi。这是上述操作的相反操作。
  • namespace 为枚举变体生成命名空间。

Tsify字段属性

  • 类型
  • 可选

Serde属性

  • 重命名
  • 重命名所有
  • 标签
  • 内容
  • 未标记
  • 跳过
  • 跳过序列化
  • 跳过反序列化
  • 跳过序列化如果= "Option::is_none"
  • 展平
  • 默认值
  • 透明

类型覆盖

use tsify_next::Tsify;

#[derive(Tsify)]
pub struct Foo {
    #[tsify(type = "0 | 1 | 2")]
    x: i32,
}

生成类型

export interface Foo {
    x: 0 | 1 | 2;
}

可选属性

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

生成类型

export interface Optional {
    a?: number;
    b?: string;
    c?: number;
}

枚举

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

生成类型

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

命名空间枚举

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

生成类型

declare namespace Color {
    export type Red = "Red";
    export type Blue = "Blue";
    export type Green = "Green";
    export type Rgb = { Rgb: [number, number, number] };
    export type Hsv = {
        Hsv: { hue: number; saturation: number; value: number };
    };
}

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

类型别名

use tsify_next::{declare, Tsify};

#[derive(Tsify)]
struct Foo<T>(T);

#[declare]
type Bar = Foo<i32>;

生成类型

export type Foo<T> = T;
export type Bar = Foo<number>;

依赖关系

~0.4–2.3MB
~48K SLoC