如何用JSON.parse的Reviver函数将字符串转为数字?TypeScript场景
问题分析与解决方案
代码中的错误点
- 语法错误:reviver函数里的
return(key: value);是无效语法,这里应该将字符串值转换为数字类型后返回,正确写法是return Number(value);。 - 判断逻辑不准确:直接用
!isNaN(value)存在漏洞——比如空字符串""或者字符串" "会被isNaN判定为false(因为Number("")等于0),导致误转换。应该先把字符串转为数字,再判断是否为有效数字:!isNaN(Number(value)) && typeof value === 'string'。 - 冗余操作:
JSON.parse(JSON.stringify(cards[0]))属于多余的序列化再反序列化,直接对cards[0]的字段做类型转换更高效。
修正后的代码示例
方案1:修复reviver函数
interface Card { sub_type: number; year: number; peak: string; } let cards: Array<Card> = pt_cards['data']; let tstCard: Card = JSON.parse(JSON.stringify(cards[0]), (key, value) => { // 仅处理字符串类型,且能转换为有效数字的情况 if (typeof value === 'string' && !isNaN(Number(value))) { return Number(value); } return value; });
方案2:直接遍历对象转换(更高效)
interface Card { sub_type: number; year: number; peak: string; } let cards: Array<Card> = pt_cards['data']; const rawCard = cards[0]; const tstCard: Card = { ...rawCard, sub_type: Number(rawCard.sub_type), year: Number(rawCard.year), // peak字段保持字符串类型,无需转换 };
Interface是否需要修改?
不需要修改原Interface。只要保证转换后的字段类型和Interface定义一致(比如sub_type和year是数字,peak是字符串),TypeScript就会认可这个对象符合Card类型。如果原Interface里这些字段定义的是字符串,那才需要修改为数字类型——但根据你的期望输出,原Interface应该已经是数字类型的定义了。
内容的提问来源于stack exchange,提问作者Remo
相关产品推荐
相关产品推荐

