【发布时间】:2022-01-21 23:10:05
【问题描述】:
我是 ts 新手,刚刚开始将我的应用从 js 迁移到 ts。 第一个函数 - calcAvg,接受一个数字数组并返回它们的平均值。 第二个函数 - 获取对象列表。每个对象都有每日统计数据(参见 DailyData 接口)。 TS 将 calcAvg(marginArray) 标记为错误 - “'(number | null)[]' 类型的参数不可分配给 'number[]' 类型的参数。 输入'号码 | null' 不可分配给类型 'number'。 类型“null”不可分配给类型“number”.ts(2345) const marginRevArray: (number | null)[]"
在 calcAvg 之前,我正在检查数组中的空值,如果有一个或多个空值,我不计算平均值。
任何想法我在这里错过了什么? 谢谢!
***见下面的代码
interface DailyData {
id: number
cost: number
margin: number
}
const calcAvg = (dataList: number[]) => {
const reducer = (accumulator: number, curr: number) => accumulator + curr;
const dataSum = dataList.reduce(reducer, 0);
return dataSum / dataList.length;
};
const avgMargin = (dailyData: DailyData[]) => {
const marginArray = dailyData.map((obj: DailyData) => obj.cost > 0 ? obj.margin/obj.cost: null);
if (marginArray.some((el: number|null) => el=== null)) {
//if the array has null values don't calculate
return 'no data';
}
return calcAvg(marginArray);
};
【问题讨论】:
-
请提供minimal reproducible example,清楚地表明您面临的问题。理想情况下,有人可以将代码粘贴到像 The TypeScript Playground (link here!) 这样的独立 IDE 中,然后立即着手解决问题,而无需首先重新创建它。所以不应该有伪代码、拼写错误、不相关的错误或未声明的类型或值。
-
你必须使用类型推断,打字稿不够聪明,无法理解 marginArray 不包含任何空值。所以最后一行应该是
return calcAvg(marginArray as number[]); -
检查是否有一些值先
<= 0,如果有则返回,否则-map。 -
如果你可以重构使用
every而不是some,那么你可以注解使用它作为类型保护like this。你要我写一个答案吗?让我知道。无论哪种方式,您都应该修正问题代码中的拼写错误。 -
@Bergi 感谢您的更正,您说得对,我没有使用正确的术语(我脑残了)。但正确的术语实际上是“断言”。强制转换意味着数据在运行时发生了变化(或者至少是一些关于运行时应该如何解释数据的信息)。这在打字稿中不会发生,因为 javascript 没有改变。
标签: javascript typescript