完整的打字稿错误:
类型'(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;
}
关于如何在此处正确设置类型的想法?
答案 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));