如何使用模式匹配实现映射



我想写一个map的模式匹配实现,所以我写了这个:

const map = (f, [x, ...xs]) => {
return (!x && !xs) ? [] : [f(x), ...map(f, xs)];
}

但是,编译器抱怨递归调用中的xs参数:

类型"any[

]"的参数不能分配给类型为"[any, ...任何[]]'。 类型"any[]"中缺少属性"0">

我也尝试了[f(x), ...map(f, [xs])],但这会产生堆栈溢出错误。

我做错了什么?

如果我理解正确,我认为问题是比较...xs 参数通过 &&,导致递归永无止境。你只关心下一个要处理的数组道具是否存在,其余的将被下一个递归捕获。

编译器错误来自参数数组没有类型定义,tsc 从源代码中推断出一个:但是类型 [any, ...any[]] 太窄了。使用 :any[] 键入数组可清除问题。

我希望这有所帮助。

const map = (f, [x, ...rest]:any[]) => {
return (!x) ? [] : [f(x), ...map(f, rest)];
}
console.log(map(x=>x+10, [1,2,3]))

最新更新