类型 'void[]' 不可分配给类型 'Foo[]'

Type 'void[]' is not assignable to type 'Foo[]'

我正在使用 ramda mapforEach 方法,但是当我将鼠标悬停在 result 变量上时。它给出以下错误:

类型 'void[]' 不可分配给类型 'Foo[]'。

数据类型Foo和代码是正确的,我确定。

我知道我遗漏了 return 语句。我不确定在哪里添加。

谁能帮我解决这个问题?

interface Foo {
  a: number;
  d: number;
  c: number;
}

const col = ["a", "d", "c"];
    const arr = [{ a: 1, c: 2, d: 3 }];

    const ress: Foo[] = map(_item => {
      const item = _item;
      forEach(c => {
        const val = item[c];
        delete item[c];
        item[c] = val;
      }, col);
    }, arr);

map 函数总是将一件事映射到另一件事。意味着它需要一些东西 return 一些东西

但这里你没有 return 将其视为无效的任何东西

我觉得应该是这样的

const col = ["a", "d", "c"];
    const arr = [{ a: 1, c: 2, d: 3 }];

    const ress: Foo[] = map(_item => {
      const item = _item;
      forEach(c => {
        const val = item[c];
        delete item[c];
        item[c] = val;
      }, col);
      return item
    }, arr);


  };

你可以写得更简单:

const col = ["a", "d", "c"];
const arr = [{ a: 1, c: 2, d: 3 }];

const project = (col, arr) => 
  arr .map (o => col .reduce ((a, b) => ({... a, [b]: o [b]}), {}))

console .log (project (col, arr))
  //~> [{a: 1, d: 3, c: 2}]

这个函数在 Ramda 中已经存在,project

我们可以这样做:

const col = ["a", "d", "c"];
const arr = [{ a: 1, c: 2, d: 3 }];

console .log (project (col, arr))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>
<script> const {project} = R                                         </script>

但是,如果您不使用它来创建对象属性的适当子集,我建议您根本不需要此功能。它所做的只是创建一个新版本的对象,并按特定顺序添加属性。但是对象在逻辑上应该被视为无序集合,所以看起来很浪费。

如果您真的将它用于一部分属性,可以使用 Ramda 版本。但上面的第一个版本似乎也是一个合理的替代品。