You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JSON.parse的Reviver函数将字符串转为数字?TypeScript场景

问题分析与解决方案

代码中的错误点

  1. 语法错误:reviver函数里的return(key: value);是无效语法,这里应该将字符串值转换为数字类型后返回,正确写法是return Number(value);。
  2. 判断逻辑不准确:直接用!isNaN(value)存在漏洞——比如空字符串""或者字符串" "会被isNaN判定为false(因为Number("")等于0),导致误转换。应该先把字符串转为数字,再判断是否为有效数字:!isNaN(Number(value)) && typeof value === 'string'。
  3. 冗余操作: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 01:35:06