JSON 字符串转 TypeScript 接口:类型转换的实用指南

json 字符串转 typescript 接口:类型转换的实用指南

本文旨在解决将 JSON 字符串数据转换为 TypeScript 接口数据类型时,如何进行有效的类型转换,特别是将字符串转换为数字类型。我们将探讨使用 JSON.parse 的 reviver 函数进行转换的替代方案,并提供使用 map 函数进行类型转换的示例代码,以及最佳实践建议。

类型转换方法:map 函数

虽然可以使用 JSON.parse 的 reviver 函数进行类型转换,但更清晰、更易于维护的方法是使用 map 函数。这种方法允许您显式地控制每个字段的转换过程,并能更好地处理错误。

以下是一个示例,展示了如何使用 map 函数将包含字符串类型数字的 JSON 数组转换为 TypeScript 接口数组,并进行类型转换:

type Card = {  sub_type: number;  year: number;  peak: string;}type SerializedCard = {  sub_type: string;  year: string;  peak: string;}function stringToNumberExn(s: string): number {  const n = Number.parseInt(s);  if (Number.isNaN(n)) {    throw new Error(`stringToNumberExn: ${s} is not a number`);  }  return n;}async function getCards(): Promise<Array> {  // 模拟从后端获取的 JSON 数据  const res: Array = [    { sub_type: "0", year: "2023", peak: "N" },    { sub_type: "1", year: "2024", peak: "Y" }  ]; //await fetch("/path/to/cards").then(r => r.json());  // 使用 map 函数进行类型转换  return res.map(card => ({    sub_type: stringToNumberExn(card.sub_type),    year: stringToNumberExn(card.year),    peak: card.peak  }));}// 示例调用getCards().then(cards => console.log(cards));

代码解释:

定义接口: 首先定义了 Card 和 SerializedCard 两个 TypeScript 接口,分别表示转换后的目标类型和原始的 JSON 数据类型。stringToNumberExn 函数: 该函数负责将字符串转换为数字。它使用 Number.parseInt 进行转换,并进行错误处理,如果字符串无法转换为数字,则抛出异常。getCards 函数: 该函数模拟从后端获取 JSON 数据,并使用 map 函数对数据进行转换。对于每个 SerializedCard 对象,创建一个新的 Card 对象,并将 sub_type 和 year 字段通过 stringToNumberExn 函数转换为数字类型。peak 字段: peak 字段保持不变,因为它已经是字符串类型。错误处理: stringToNumberExn 函数中的错误处理确保了在遇到无法转换为数字的字符串时,能够及时发现并处理错误。

使用 JSON.parse 的 reviver 函数 (不推荐)

虽然 map 是更推荐的方法,但为了完整性,这里也提供使用 JSON.parse 的 reviver 函数的示例:

type Card = {  sub_type: number;  year: number;  peak: string;}const jsonString = `[{"sub_type": "0", "year": "2023", "peak": "N"}, {"sub_type": "1", "year": "2024", "peak": "Y"}]`;const cards: Card[] = JSON.parse(jsonString, (key, value) => {  if (typeof value === 'string' && !isNaN(Number(value))) {    return Number(value);  }  return value;});console.log(cards);

代码解释:

JSON.parse 的第二个参数是一个 reviver 函数,它会在解析过程中对每个键值对调用。在 reviver 函数中,我们检查值是否为字符串,并且是否可以转换为数字。如果是,则将其转换为数字。否则,保持原值不变。

注意: 这种方法可能会导致一些问题,例如:

难以区分哪些字符串应该转换为数字,哪些不应该。错误处理比较困难。

总结与最佳实践

优先使用 map 函数进行类型转换。 这种方法更清晰、更易于维护,并且可以更好地控制错误处理。定义明确的 TypeScript 接口。 这有助于确保类型安全,并提高代码的可读性。编写专门的类型转换函数。 像 stringToNumberExn 这样的函数可以提高代码的重用性,并使类型转换过程更加清晰。进行适当的错误处理。 确保能够处理无法转换为数字的字符串,并向用户提供有意义的错误信息。避免不必要的 JSON.stringify 和 JSON.parse 操作。 如果您已经有 JavaScript 对象,则无需将其转换为 JSON 字符串再解析回来。这会降低性能,并可能引入错误。

通过遵循这些最佳实践,您可以更有效地将 JSON 数据转换为 TypeScript 接口,并编写更健壮、更易于维护的代码。

以上就是JSON 字符串转 TypeScript 接口:类型转换的实用指南的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1523806.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月20日 16:14:14
下一篇 2025年12月20日 16:14:35

相关推荐

  • 怎样利用WebUSB API与硬件设备进行通信?

    WebUSB API允许网页通过浏览器直接与USB设备通信。在安全上下文下,调用navigator.usb.requestDevice()请求设备连接,用户授权后获得访问权限。接着调用device.open()打开设备,selectConfiguration()选择配置,claimInterface…

    2025年12月20日
    000
  • Snowflake响应转换器中动态迭代的实现:UDF与存储过程的结合策略

    本文探讨了如何在Snowflake响应转换器中动态获取数据(如表行数)以控制迭代,解决了直接在转换器中调用存储过程的限制。核心策略是将原存储过程的逻辑重构为JavaScript用户定义函数(UDF),并在调用时将其结果作为参数传递给响应转换器,从而实现灵活的数据处理和迭代控制。 挑战:在Snowfl…

    2025年12月20日
    000
  • JavaScript模块化开发中有哪些最佳实践值得遵循?

    优先使用ES6模块语法,提升静态分析和打包效率;2. 模块职责单一,按功能拆分目录,避免巨型工具模块;3. 合理组织结构,利用别名和index.js简化路径;4. 避免循环依赖,可用动态导入或重构公共逻辑解决。 在JavaScript模块化开发中,遵循一些关键的最佳实践能显著提升代码的可维护性、复用…

    2025年12月20日
    000
  • JavaScript中的Web Animations API相比CSS动画有何优势?

    Web Animations API提供比CSS动画更强大的运行时控制能力,支持在JavaScript中直接暂停、播放、反向、调整速率及跳转时间点,无需依赖类名切换或CSS变量;可动态定义关键帧与动画参数,减少DOM操作与样式冲突,便于封装复用;能结合用户交互、设备数据等驱动动画,实现响应式逻辑;支…

    2025年12月20日
    000
  • 构建React应用管理后台:从本地JSON到Headless CMS的实践指南

    本文探讨了为React应用创建管理后台的多种方法,特别针对从本地JSON文件管理数据到实现可编辑、删除和添加内容的场景。我们将深入分析直接操作本地文件的局限性,介绍后端服务的重要性,并重点推荐使用Strapi等无头CMS作为高效、可扩展的解决方案,帮助开发者轻松构建功能完善的管理界面。 React应…

    2025年12月20日
    000
  • Electron 应用任务栏右键菜单:理解、定制与打包实践

    本教程旨在解决Electron应用在任务栏右键菜单中显示“Electron”选项的困惑。我们将澄清该选项并非“Electron主页”,而是未打包应用的新实例。核心解决方案在于使用Electron Forge或Electron Builder等工具将应用打包,并通过productName定制显示名称,…

    2025年12月20日
    000
  • JavaScript 的模块化历程:从 IIFE 到 ESM 经历了哪些演变?

    从IIFE到ESM,JavaScript模块化经历了由手动封装到原生标准的演进。早期通过IIFE隔离作用域,解决全局污染;Node.js推动CommonJS实现服务端同步加载;AMD针对浏览器异步加载设计,但语法繁琐;最终ES6引入ESM,支持静态分析、tree-shaking和动态导入,成为跨平台…

    2025年12月20日
    000
  • React应用管理面板构建指南:从本地JSON到无头CMS的实践策略

    为React应用构建管理员面板,以高效管理数据是常见需求。本文将探讨从本地JSON文件管理的局限性出发,逐步介绍客户端下载替换方案、自定义后端解决方案,并重点推荐使用Strapi等无头CMS作为现代、高效且可扩展的数据管理平台,帮助开发者为React应用快速搭建功能完善的管理界面。 1. 理解本地J…

    2025年12月20日
    000
  • 如何实现一个支持AST转换的代码压缩工具?

    答案:基于AST的代码压缩工具通过解析源码生成AST,遍历并转换节点(如变量名压缩),再序列化为压缩代码。1. 使用Babel Parser等工具解析代码为AST;2. 利用@babel/traverse遍历AST,应用访问器模式修改节点;3. 通过@babel/generator生成压缩代码并支持…

    2025年12月20日
    000
  • 如何用D3.js实现一个交互式的地理信息图?

    首先加载GeoJSON地理数据并使用d3.geoMercator投影绘制基础地图,接着通过d3.geoPath生成SVG路径;然后添加mouseover和mouseout事件实现悬停高亮与提示框显示区域名称,结合d3-tip增强交互视觉效果;再利用d3.zoom支持地图缩放和平移,使用户可拖动浏览;…

    2025年12月20日
    000
  • 为React应用构建管理员面板:从本地JSON到无头CMS的数据管理策略

    本文探讨了为React应用创建管理员面板以管理数据(如商品信息)的多种策略。从简单的客户端本地JSON文件编辑,到传统后端集成,再到现代无头CMS(如Strapi)的运用,文章详细分析了各种方案的优缺点,并提供了实现思路和代码示例,旨在帮助开发者选择最适合其项目需求的数据管理解决方案。 引言:从静态…

    2025年12月20日
    000
  • 如何利用地理定位API构建基于位置的Web应用?

    使用Geolocation API获取用户授权后的经纬度;2. 通过地图服务如Mapbox可视化位置;3. 前后端协作实现附近餐厅等基于位置的服务;4. 优化体验并处理定位异常与隐私问题。 构建基于位置的Web应用,地理定位API是核心工具之一。它能获取用户设备的经纬度信息,为后续的位置服务打下基础…

    2025年12月20日
    000
  • JavaScript中的柯里化(Currying)与部分应用(Partial Application)有何区别?

    柯里化将多参数函数转换为一元函数链,如add(1)(2)(3);部分应用通过bind预设参数生成新函数,如partialMultiply(4)。 柯里化和部分应用都涉及将多参数函数转换为更小的函数链,但它们的核心思想和实现方式不同。 柯里化(Currying) 柯里化是把接受多个参数的函数转换成一系…

    2025年12月20日
    000
  • JavaScript中的代码覆盖率工具是如何工作的?

    代码覆盖率工具通过插桩和执行监控反映测试对代码的覆盖情况。首先在函数、语句、分支处插入计数器,测试运行时记录执行痕迹;Node.js利用require钩子,浏览器结合Karma或Jest捕获轨迹;最终生成报告,展示语句、分支、函数、行级覆盖率,以颜色标识覆盖状态,帮助定位未测代码,但高覆盖率不等于高…

    2025年12月20日
    000
  • 如何设计一个可扩展的前端插件架构?

    答案:设计可扩展前端插件架构需解耦主系统与插件,提供清晰API如registerPlugin()和init()/destroy()生命周期方法,通过事件总线实现通信;采用动态import()按需加载插件,支持远程部署与JSON元配置;引入沙箱机制隔离风险,利用共享状态与发布-订阅模式实现安全的插件间…

    2025年12月20日
    000
  • Electron 应用任务栏右键菜单默认启动项配置指南

    本文旨在解决Electron应用在任务栏右键菜单中默认显示并启动“Electron”空实例的问题。核心解决方案是通过使用Electron Forge或Electron Builder等工具将应用打包成独立的exe可执行文件。打包后,任务栏右键菜单的默认选项将自动指向并启动你的应用程序,并且可以通过配…

    2025年12月20日
    000
  • JavaScript处理HTML输入字段中的\n字符串并实现多行显示教程

    本教程详细讲解如何在JavaScript中,将HTML输入字段中用户输入的字面量n字符(表示换行)正确解析并渲染为HTML 元素内的实际换行效果。文章通过示例代码演示了如何利用字符串分割和innerHTML属性,将特殊字符转换为浏览器可识别的换行标记,从而实现内容的清晰多行展示。 1. 问题背景与挑…

    2025年12月20日 好文分享
    000
  • 利用jQuery实现鼠标悬停图片切换及原始SRC的优雅恢复

    本文详细探讨了如何在网页中实现鼠标悬停图片切换效果,并在鼠标移出时将图片恢复到其原始状态,而无需硬%ignore_a_1%原始图片路径。通过分析常见的DOM元素选择错误,文章提供了使用 document.querySelector() 或 jQuery 选择器正确获取并存储原始图片 src 的解决方…

    2025年12月20日
    000
  • 前端构建中如何利用Tree-shaking删除无用代码?

    Tree-shaking 能有效移除未使用代码,依赖 ES6 静态模块系统,需使用 import/export 语法,避免 CommonJS 动态引入;应选用支持 Tree-shaking 的打包工具如 Webpack(生产模式默认开启)、Rollup 或 Vite,并确保引入的库提供 ESM 版本…

    2025年12月20日
    000
  • 解决Bing新闻搜索API中originalImg参数不生效的问题

    本文旨在解析Bing新闻搜索API中originalImg参数的使用限制,指出其仅适用于/news/search端点,而非/news端点。通过对比错误用法和正确用法,帮助开发者理解如何有效获取新闻条目的原始图片URL,避免仅获取缩略图的问题,从而优化API调用策略。 在使用bing新闻搜索api时,…

    2025年12月20日
    000

发表回复

登录后才能评论
关注微信