Rust如何调用TypeScript代码

如何在Rust项目中调用TypeScript编写的代码?目前有一个用TypeScript实现的算法模块,想在Rust程序中调用它。是否需要通过WebAssembly或Node.js桥接?有没有性能更好的直接调用方式?具体应该如何实现?最好能提供简单的代码示例说明集成步骤。

2 回复

Rust不能直接调用TypeScript代码。两种方案:

  1. 编译转换:将TypeScript编译为JavaScript,通过Node.js运行,Rust通过子进程或FFI调用Node.js。

  2. WebAssembly:将TypeScript编译为WebAssembly,Rust通过wasmtime等库调用。

推荐第一种,更成熟稳定。


在Rust中直接调用TypeScript代码是不可行的,因为两者运行在不同环境中:Rust是编译型系统语言,而TypeScript需转译为JavaScript并在JavaScript引擎(如Node.js或浏览器)中执行。不过,可通过以下方法实现互操作:

1. 使用子进程调用Node.js执行TypeScript

将TypeScript代码编译为JavaScript,通过Rust的std::process::Command启动Node.js子进程来运行:

use std::process::Command;

fn main() {
    let output = Command::new("node")
        .arg("path/to/compiled_script.js")
        .output()
        .expect("执行失败");

    if output.status.success() {
        println!("输出: {}", String::from_utf8_lossy(&output.stdout));
    } else {
        eprintln!("错误: {}", String::from_utf8_lossy(&output.stderr));
    }
}

步骤

  • 先用tsc编译TypeScript为JavaScript(例如:tsc script.ts)。
  • Rust调用Node.js运行生成的.js文件。

2. 通过WebAssembly(WASM)交互

将TypeScript/JavaScript逻辑编译为WASM模块,在Rust中加载:

  • 使用工具如assemblyscript将TypeScript编译为WASM。
  • Rust通过wasmtimewasmer库执行WASM模块:
    // 添加依赖:wasmtime = "0.29"
    use wasmtime::{Engine, Store, Module, Instance};
    
    fn main() -> Result<(), Box<dyn std::error::Error>> {
        let engine = Engine::default();
        let module = Module::from_file(&engine, "path/to/module.wasm")?;
        let instance = Instance::new(&mut Store::new(&engine, ()), &module, &[])?;
        // 调用WASM函数
        Ok(())
    }
    

3. 使用Rust的Node.js绑定(如Neon)

通过neon库在Node.js中直接嵌入Rust代码,反向调用JavaScript/TypeScript函数:

  • 创建Node.js项目,使用neon构建Rust原生模块。
  • 在Rust中通过Neon API调用JavaScript函数(需在Node.js环境中运行)。

注意事项:

  • 性能与复杂度:子进程方式简单但开销较大;WASM适合高性能计算场景;Neon需依赖Node.js环境。
  • 类型安全:跨语言调用时需手动处理数据序列化(如通过JSON)。

根据实际需求选择合适方案,子进程方法最易快速实现。

回到顶部