Typescript中的array.reduce函数引发类型错误
我有一个NameValuePair接口,我想写一个函数,将一个名值对列表“减少”为一个字符串。在这种情况下,函数将生成一个查询字符串,例如 ?姓名=foo,年龄=10 超出给定的名称-值对Typescript中的array.reduce函数引发类型错误,typescript,Typescript,我有一个NameValuePair接口,我想写一个函数,将一个名值对列表“减少”为一个字符串。在这种情况下,函数将生成一个查询字符串,例如 ?姓名=foo,年龄=10 超出给定的名称-值对 export interface NameValuePair { name: string, value: any }; export const nameValuePairsToString = ( pairs: NameValuePair[], innerSeperator: strin
export interface NameValuePair {
name: string,
value: any
};
export const nameValuePairsToString = (
pairs: NameValuePair[],
innerSeperator: string="=", outerSeperator: string="&",
startValue="?"
): string => (
pairs.reduce((acc: string, pair: NameValuePair, idx: number): string => {
const pairAsString = pair.name + innerSeperator + pair.value;
const tail = idx === 0
? pairAsString
: outerSeperator + pairAsString;
return acc + tail;
}), startValue);
TypeScript在传递给reducer的匿名函数的定义处抛出此错误:
类型为“(acc:string,pair:NameValuePair,idx:number)=>string”的参数不可分配给类型为“(previousValue:NameValuePair,currentValue:NameValuePair,currentIndex:number,array:NameValuePair[])=>NameValuePair”的参数。
参数“acc”和“previousValue”的类型不兼容。
类型“NameValuePair”不可分配给类型“string”。ts(2345)
无法将一种类型(NameValuePair)的数组缩减为另一种类型(string)。我以为这就是减速机的全部意义?在JavaScript中,我总是这样使用Array.prototype.reduce
。。。
在TypeScript中是不可能的,还是我做错了什么?你的括号错了 你的开场白:
export const nameValuePairsToString = (...): string => (
在此处终止:
}), startValue);
应该是:
}, startValue));
您也可以省略它:
export const nameValuePairsToString = (
pairs: NameValuePair[],
innerSeperator: string = "=", outerSeperator: string = "&",
startValue = "?"
): string => pairs.reduce((acc: string, pair: NameValuePair, idx: number): string => {
const pairAsString = pair.name + innerSeperator + pair.value;
const tail = idx === 0
? pairAsString
: outerSeperator + pairAsString;
return acc + tail;
}, startValue);
或使用括号:
export const nameValuePairsToString = (
pairs: NameValuePair[],
innerSeperator: string="=", outerSeperator: string="&",
startValue="?"
): string =>
(pairs.reduce((acc: string, pair: NameValuePair, idx: number): string => {
const pairAsString = pair.name + innerSeperator + pair.value;
const tail = idx === 0
? pairAsString
: outerSeperator + pairAsString;
return acc + tail;
}, startValue));
您可以通过以下方式看到它的工作原理:
console.log(nameValuePairsToString([
{name: 'foo', value: 'bar'},
{name: 'age', value: 10}])
);
在其输出时:
?foo=bar&age=10
你把括号弄错了 你的开场白:
export const nameValuePairsToString = (...): string => (
在此处终止:
}), startValue);
应该是:
}, startValue));
您也可以省略它:
export const nameValuePairsToString = (
pairs: NameValuePair[],
innerSeperator: string = "=", outerSeperator: string = "&",
startValue = "?"
): string => pairs.reduce((acc: string, pair: NameValuePair, idx: number): string => {
const pairAsString = pair.name + innerSeperator + pair.value;
const tail = idx === 0
? pairAsString
: outerSeperator + pairAsString;
return acc + tail;
}, startValue);
或使用括号:
export const nameValuePairsToString = (
pairs: NameValuePair[],
innerSeperator: string="=", outerSeperator: string="&",
startValue="?"
): string =>
(pairs.reduce((acc: string, pair: NameValuePair, idx: number): string => {
const pairAsString = pair.name + innerSeperator + pair.value;
const tail = idx === 0
? pairAsString
: outerSeperator + pairAsString;
return acc + tail;
}, startValue));
您可以通过以下方式看到它的工作原理:
console.log(nameValuePairsToString([
{name: 'foo', value: 'bar'},
{name: 'age', value: 10}])
);
在其输出时:
?foo=bar&age=10
第一眼:双括号
(
在reduce.First参数应该是前面的值acc
,不是callable如果我错了请纠正我,但我认为Array.reduce将函数作为第一个参数(因此匿名箭头函数的双括号)第二个参数是initValue,我认为这也不是问题所在,因为如果你写一个没有花括号的箭头函数(只是妄想)您不需要编写return关键字,而是根据默认值返回值。我认为问题在于为reduce提供的每个参数的匿名函数,因为错误表明函数的参数类型不适合(acc对我来说是字符串,它说它必须是NameValuePair)。我认为reducer的工作方式不同,因此“previousValue”可以是任何类型的值…第一眼:reduce处的双括号(
)。第一个参数应该是先前的值acc
,而不是可调用的。如果我错了,请纠正我,但我认为Array.reduce将函数作为第一个参数(因此匿名arrow函数的双括号)和第二个参数initValue。我认为这也不是问题所在,因为如果你编写一个没有花括号的arrow函数(只是妄想)您不需要编写return关键字,而是根据默认值返回值。我认为问题在于为reduce提供的每个参数的匿名函数,因为错误表明函数的参数类型不适合(acc对我来说是字符串,它说它必须是NameValuePair).我认为减速机的工作方式不同,所以“以前的值”可以是任何类型的值…非常感谢!它工作了,但我不明白为什么。我认为右括号放错了。奇怪的错误消息though@IceRevenge是的,我同意错误信息乍一看并没有多大帮助。我标记了错误括号的位置。非常感谢!它起作用了,但我不明白为什么。我不知道hink右括号放错了。奇怪的错误消息though@IceRevenge是的,我同意错误信息乍一看并没有那么大帮助。我标记了错误括号的位置。