代码之家  ›  专栏  ›  技术社区  ›  bugs

如何实现模式匹配地图

  •  1
  • bugs  · 技术社区  · 6 年前

    map

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

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

    …任何[]]'。类型“any[]”中缺少属性“0”

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

    1 回复  |  直到 6 年前
        1
  •  2
  •   Roope    6 年前

    如果我理解正确的话,我认为问题是通过&比较…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]))