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日 |
#62 在 WebAssembly 中
4,897 每月下载量
用于 dji-log-parser
27KB
325 行
Tsify-next
Tsify-next 是一个从Rust代码生成TypeScript定义的库。原始的 Tsify 似乎处于休眠状态。此仓库将保持更新,直到主要Tsify项目恢复活力。
使用 wasm-bindgen
将自动将类型输出到 .d.ts
。
受 typescript-definitions
和 ts-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_section
和 Rust 类型转换
导致的行为。
Crate功能
json
(默认)通过serde_json
启用序列化。js
通过serde-wasm-bindgen
启用序列化并为其生成适当的类型。这将是未来版本的默认值。
属性
Tsify容器属性
into_wasm_abi
实现IntoWasmAbi
和OptionIntoWasmAbi
。这可以通过serde_json
或serde-wasm-bindgen
直接从Rust转换为JS。from_wasm_abi
实现FromWasmAbi
和OptionFromWasmAbi
。这是上述操作的相反操作。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