TS报错Type 'string' is not assignable to type 'number'解决方法
报错原因
这个类型错误的触发逻辑非常明确:
- 你的函数签名明确标注返回值类型为
number,但实际返回的valueSplit是调用字符串split('')方法生成的字符串数组,类型为string[],数组成员全是string类型,和要求返回的number类型完全不匹配,TS静态检查时就会抛出该类型不兼容错误。 - 代码里存在冗余的类型声明:
valueString被标注为string | number联合类型完全没有必要,入参value本身就被约束为number类型,直接调用toString方法即可,多余的联合类型声明只会增加不必要的类型判断成本。
修复方法
首先要对齐函数的类型约束和实际逻辑:如果你的目标是实现带精度控制的舍入函数,不要直接返回拆分后的字符串数组,补全舍入逻辑后最终返回number类型的结果即可。
参考常规场景下可直接运行的实现代码:
export const roundWithPrecision = ( value: number, decimalPrecision: number, ): number => { // 边界情况处理:精度为非正数时直接返回整数舍入结果 if (decimalPrecision <= 0) return Math.round(value); const precisionMultiplier = 10 ** decimalPrecision; return Math.round(value * precisionMultiplier) / precisionMultiplier; };
如果你坚持用字符串拆分的方案规避JS浮点数运算的精度问题,只需要在字符串处理完成后,把最终拼接的结果用Number()转回数字类型再返回即可,禁止直接返回拆分后的字符串数组。
举个纯字符串实现的简化示例:
export const roundWithPrecision = ( value: number, decimalPrecision: number, ): number => { if (decimalPrecision <= 0) return Math.round(value); const [intPart, decPart = ''] = value.toString().split('.'); // 小数位不足精度位直接返回原值 if (decPart.length <= decimalPrecision) return value; // 取到精度位后一位做四舍五入判断,拼接后转回数字 const roundCarry = Number(decPart[decimalPrecision]) >= 5 ? 1 : 0; const fixedDecimal = Number(decPart.slice(0, decimalPrecision)) + roundCarry; return Number(`${intPart}.${fixedDecimal.toString().padStart(decimalPrecision, '0')}`); };
注意:纯字符串实现需要额外处理进位后小数位长度溢出、负数舍入等边界问题,日常使用直接用乘除计算的方案足够覆盖绝大多数场景。
内容的提问来源于stack exchange,提问作者amorim
相关产品推荐
相关产品推荐

