在Array.reduce

时间:2019-01-13 08:52:45

标签: typescript

在Array.reduce中使用某些初始值时,TypeScript在此Playground example中报告一个奇怪的错误。

在以下示例的第2行中,针对Argument of type 'number' is not assignable to parameter of type 'never'显示了错误c

const foo = [1, 2, 3].reduce((p, c) => {
    p.bar.push(c);
    return p;
}, {bar: []});

document.write(`foo=${JSON.stringify(foo)}`);

1 个答案:

答案 0 :(得分:1)

有充分的理由,当您启用strictNullChecks时,会发生此错误。 Array.reduce的初始值为{bar: []},无法解析为安全类型。是数组any[]还是number[]?因此,TypeScript假定它为never[],因为它无法从lambda内部的使用情况推断出数组的类型(它只能反过来起作用)。

顺便说一句,没有strictNullChecks的数组的类型为undefined[],但是该标志基本上将undefined出现的所有类型替换为never,这导致您的示例失败,因为格式为const foo = [];的分配类型为never[]且设置严格。

为了解决此问题,您必须将初始值设置为{bar: [] as number[]}才能显式键入该数组,并且它可以工作:

const foo = [1, 2, 3].reduce((p, c) => {
    p.bar.push(c);
    return p;
}, {bar: [] as number[]});

document.write(`foo=${JSON.stringify(foo)}`);