我有一个结构,可以使用 Rust 和 wasm 向我的 Typescript 应用程序公开:
#[wasm_bindgen]
#[derive(Clone)]
pub struct Diagnostic {
message: String,
pub start_point: TextPoint,
pub end_point: TextPoint,
}
#[wasm_bindgen]
impl Diagnostic {
#[wasm_bindgen(getter)]
pub fn message(&self) -> JsString {
self.message.clone().into()
}
}
TextPoint
也使用 #[wasm_bindgen]
进行曝光。
我正在尝试返回这些结构的数组,并仍然保留类型
尝试使用
js_sys::Array
时,我丢失了所有类型:
#[wasm_bindgen]
pub struct JSResult {
diagnostics: Vec<Diagnostic>,
}
#[wasm_bindgen]
impl JSResult {
pub fn diagnostics(&self) -> js_sys::Array {
let arr = js_sys::Array::new_with_length(self.diagnostics.len() as u32);
for i in 0..arr.length() {
let s = JsValue::from(self.diagnostics[i as usize].clone());
arr.set(i, s);
}
arr
}
}
生成的ts:
export class JSResult {
free(): void;
/**
* @returns {Array<any>}
*/
diagnostics(): Array<any>;
}
我设法以类似数组的方式返回它并仍然保留类型的唯一方法就是这样做:
#[wasm_bindgen]
pub struct JSResult {
diagnostics: Vec<Diagnostic>,
}
#[wasm_bindgen]
impl JSResult {
#[wasm_bindgen(getter)]
pub fn diagnostic_amount(&self) -> usize {
self.diagnostics.len()
}
pub fn diagnostic(&self, idx: usize) -> Diagnostic {
self.diagnostics[idx].clone()
}
}
然后在打字稿中添加一个函数将其转换为数组:
const buildDiagnosticArray = (result: JSResult): Diagnostic[] => {
return [...Array(result.diagnostic_amount).keys()].map((idx) => {
return result.diagnostic(idx);
});
}
我只是在寻找一种通用的方法来做到这一点,也许我错过了一些东西。