在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)}`);
答案 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)}`);