如何通过wasm_bindgen将Rust Vec<String>映射为TS的Array<string>
解决方案
要将SampleResult的errors字段TypeScript类型从Array<any>改为Array<string>,你需要把typescript_type参数放在#[wasm_bindgen]属性内部,而非作为方法内的变量。以下是具体实现方式:
正确代码示例
假设你的SampleResult结构体和实现代码如下,调整errors getter的属性配置即可:
use wasm_bindgen::prelude::*; use js_sys::Array; #[wasm_bindgen] pub struct SampleResult { errors: Array, } #[wasm_bindgen] impl SampleResult { // 将typescript_type作为#[wasm_bindgen]的属性参数传入 #[wasm_bindgen(getter, typescript_type = "Array<string>")] pub fn errors(&self) -> Array { self.errors.clone() } }
关键说明
- 错误原因:你之前直接在getter方法内写
typescript_type = "Array<string>",会被Rust编译器识别为未使用的变量定义,因此报错。正确的用法是将其作为#[wasm_bindgen]的属性参数,与getter标记并列。 - 运行时约束:虽然TypeScript类型会被修正为
Array<string>,但你需要确保Rust代码中errors数组内实际存储的都是字符串类型(比如通过js_sys::Array::from_iter传入&str或String的迭代器),避免运行时类型不匹配。
替代方案:使用Vec<String>直接暴露
如果你的errors原本就是Rust的Vec<String>,可以直接暴露该类型,wasm-bindgen会自动生成Array<string>的TypeScript类型,无需手动指定:
use wasm_bindgen::prelude::*; #[wasm_bindgen] pub struct SampleResult { errors: Vec<String>, } #[wasm_bindgen] impl SampleResult { #[wasm_bindgen(getter)] pub fn errors(&self) -> Vec<String> { self.errors.clone() } }
内容的提问来源于stack exchange,提问作者Kevin Hakanson
相关产品推荐
相关产品推荐

