Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript中的array.reduce函数引发类型错误_Typescript - Fatal编程技术网

Typescript中的array.reduce函数引发类型错误

Typescript中的array.reduce函数引发类型错误,typescript,Typescript,我有一个NameValuePair接口,我想写一个函数,将一个名值对列表“减少”为一个字符串。在这种情况下,函数将生成一个查询字符串,例如 ?姓名=foo,年龄=10 超出给定的名称-值对 export interface NameValuePair { name: string, value: any }; export const nameValuePairsToString = ( pairs: NameValuePair[], innerSeperator: strin

我有一个NameValuePair接口,我想写一个函数,将一个名值对列表“减少”为一个字符串。在这种情况下,函数将生成一个查询字符串,例如

?姓名=foo,年龄=10

超出给定的名称-值对

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是的,我同意错误信息乍一看并没有那么大帮助。我标记了错误括号的位置。