不能将类型'number'分配给类型'ReadonlyArray <{}>'

时间:2019-02-22 21:38:37

标签: javascript typescript ramda.js

完整的打字稿错误:

  

类型'(c:IAsset)=>数字的参数不能分配给类型'(n:IAsset)=> ReadonlyArray <{}>'的参数。     不能将类型“ number”分配给类型“ ReadonlyArray <{}>”。

我的calculatePercentage函数:

// Add coin's percentage of portfolio
export const calculatePercentage = (portfolio: IAsset[], coin: IAsset) => {
  if (coin) {
    portfolio.push(coin);
  }

  const addValue = (c: IAsset) => c.value;
  const values = R.chain(addValue, portfolio);
  const total = values.reduce((acc: number, val: number) => acc + val);

  const updatedPortfolio = portfolio.map((c) => {
    c.percentage = round((c.value / total) * 100);
    return c;
  });

  return updatedPortfolio;
};

使用addValue,我将使用IAsset类型,并返回其值(number);

然后在R.chain (addValue, portfolio)中,对addValue中类型为portfolio的每个项目使用IAsset函数。

我的界面:

export interface IAsset {
  currency: string;
  exchange: string;
  marketCap: number;
  name: string;
  percentage: number;
  price: number;
  position: number;
  value: number;
}

enter image description here

关于如何在此处正确设置类型的想法?

1 个答案:

答案 0 :(得分:3)

我对Ramda不太熟悉,但是阅读文档似乎可以正常工作:

const addValue = (c: IAsset) => [c.value];
const values = R.chain(addValue, portfolio);

但是看来您真正想使用的是map

const addValue = (c: IAsset) => c.value;
const values = R.map(addValue, portfolio);

相当于内置的map函数:

const addValue = (c: IAsset) => c.value;
const values = portfolio.map(addValue);

但是您也可以使用reduce来获取总数,而无需中间步骤来获取values

const total = portfolio.reduce((acc: number, { value }: IAsset) => acc + value, 0);

我想这是Ramda风味的版本:

var getValue = (c: IAsset) => c.value;
var adder = (a: number, b: number) => a + b;
R.reduce(adder, 0)(R.map(getValue)(portfolio));