首页 > 解决方案 > 为什么 TypeScript 在使用 concat 减少数组时会推断出“从不”类型?

问题描述

代码比语言说得更好,所以:

['a', 'b', 'c'].reduce((accumulator, value) => accumulator.concat(value), []);

该代码非常愚蠢,并返回一个复制的数组......

TS 抱怨 concat 的参数:TS2345:“字符串”类型的参数不可分配给“ConcatArray”类型的参数。

标签: typescriptfunctional-programmingreducereducersstrictnullchecks

解决方案


我相信这是因为 for 的类型[]被推断为never[],这是必须为空的数组的类型。您可以使用类型转换来解决此问题:

['a', 'b', 'c'].reduce((accumulator, value) => accumulator.concat(value), [] as string[]);

通常这不是什么大问题,因为 TypeScript 在根据您对空数组的处理方式找出更好的类型来分配给空数组方面做得不错。但是,由于您的示例正如您所说的那样“愚蠢”,因此 TypeScript 无法进行任何推断并将类型保留为never[].


推荐阅读