可变参数

在 javascript 中,函数参数的类型和函数参数的数量都是动态的。例如

function sum(...rest) {
    let i;
    // the old way
    let old_way = 0;
    for (i=0; i<arguments.length; i++) {
        old_way += arguments[i];
    }
    // the new way
    let new_way = 0;
    for (i=0; i<rest.length; i++) {
        new_way += rest[i];
    }
    // both give the same answer
    assert(old_way === new_way);
    return new_way;
}

这个函数不能直接转换为 rust,因为我们目前不支持 Wasm 目标上的可变参数。为了绑定它,我们使用一个切片作为最后一个参数,并将函数注释为可变参数


# #![allow(unused_variables)]
#fn main() {
#[wasm_bindgen]
extern "C" {
    #[wasm_bindgen(variadic)]
    fn sum(args: &[i32]) -> i32;
}
#}

当我们调用此函数时,最后一个参数将按照 javascript 的预期展开。

要将具有可变参数的 rust 函数导出到 javascript,我们将使用相同的 bindgen 可变属性,并假设最后一个参数将是可变数组。例如,以下 rust 函数


# #![allow(unused_variables)]
#fn main() {
#[wasm_bindgen(variadic)]
pub  fn  variadic_function(arr: &JsValue) -> JsValue {
    arr.into()
}
#}

将生成以下 TS 接口

export  function  variadic_function(...arr:  any):  any;