类型“ void []”不能分配给类型“ Foo []”

时间:2020-07-07 17:39:32

标签: javascript reactjs angular typescript ramda.js

我正在使用 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);

2 个答案:

答案 0 :(得分:1)

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

但是在这里,您不返回任何将其视为无效的内容

我认为应该是这样

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);


  };

答案 1 :(得分:1)

您可以写得更简单:

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}]

此功能在project的Ramda中已经存在。

我们可以这样做:

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版本。但是上面的第一个版本似乎也是一个合理的替代品。