代码生成器 · 6 分钟阅读
JSON至TypeScript:符合实际的类型
获得 API 的正确 TypeScript 类型的最快方法是根据 API 实际返回的响应生成它们。手写界面描述了你期望的有效负载; JSON 到 TypeScript 的转换描述了你所拥有的有效负载,而这两者之间的差距就是运行时崩溃的地方。
已更新
为什么手写字体会出现漂移
根据文档或记忆编写的接口往往是乐观的。他们标记存在的所有内容,假设可为空的字段始终存在,并悄悄地错过仅出现在高级帐户中的嵌套对象。然后TypeScript强制执行服务器从未承诺过的形状,并且第一个`undefined`在生产中而不是在编译时出现。从真实响应生成会颠倒该过程:编译器正在检查观察到的形状而不是希望的形状。
读取生成的文件
有用的转换在嵌套对象的键之后命名,保持数组元素类型完整,并显式表达不确定性。注意具有所有含义的三个标记:
export interface Order {
id: string;
total: number;
coupon?: string; // absent in some responses
shippedAt: string | null; // present but null until shipped
items: Array<OrderItem>;
}
`coupon?: string` 和`shippedAt: string | null` 之间的差异并不是表面上的。可选意味着密钥可以丢失; null 表示键没有值。 API 通常在同一个有效负载中执行这两项操作,并将它们合并在一起,将空检查推送到假定字符串的代码中。
使用多个样本
单个响应标志着所需的一切。粘贴两到三个响应(理想情况下,一个来自空帐户,一个来自完整帐户),可选键就会显示出来:任何样本中缺少的字段将变为 `?`,有时为空的字段将变为与 `null` 的并集。这是可用的最便宜的正确性升级,这就是当 API 更改时应该重新生成生成的类型而不是一次性写入的原因。
切勿让生成的界面成为 API 的唯一描述。保留架构或契约测试,这样服务器更改就会导致构建失败,而不是用户会话失败。
类型所属的位置
- 专用的 `types/` 或 `api/` 文件夹,不分散在组件中。
- 每个端点或每个资源一个文件,带有命名端点及其捕获日期的注释。
- 再生注释:哪个调用产生了有效负载,以便下一个人可以重复它。
- 获取层和组件都会使用导出,因此更改恰好会破坏一个位置。
开启严格模式
生成的类型只有在启用 `strict` 时才有效,因为这使得可选键在直接访问时成为实际错误。将生成的接口与获取边界处的 `unknown` 配对,并在使用前缩小:`JSON.parse` 返回 `any`,因此对生成的接口的强制转换应该是您已验证的点,而不是您希望的点。
从您不会上传的有效负载生成
API 响应是大多数开发人员处理的最敏感的JSON 账户数据、订单、代币。在浏览器中运行 JSON 到 TypeScript 转换意味着有效负载在本地进行解析并且永远不会传输,因此您可以粘贴真实的响应而无需先进行编辑,并且该工具可以保持离线工作。
JSON 至 TypeScript — 常见问题
如何使生成的字段可选?
包含该密钥不存在的第二个样本并重新生成 — 然后转换器发出 `key?: type`。推理仅在有证据表明该字段不存在时才将其标记为可选字段,这就是为什么一个样本永远不足以签订合同的原因。
对于生成的 JSON 类型,我应该使用接口还是类型?
两者都适用于物体形状;接口对于API模型来说是传统的,因为它们可以扩展并产生更清晰的错误消息。重要的选择是 `strict` 模式,而不是您选择的关键字。
我可以在不向服务器发送数据的情况下将 JSON 转换为 TypeScript 吗?
是的。该站点上的转换器会在页面本身中生成接口,因此响应永远不会离开您的浏览器,并且在网络禁用时转换仍会继续进行。
这篇文章中提到的工具
更多文章可供阅读
5 分钟阅读
JSON 到 Go:第一次尝试时解组的结构
将 JSON 转换为具有正确字段名称和 json 标签的 Go 结构,包括嵌套类型 - 以及要观察的数字、null 和时间陷阱。
6 分钟阅读
JSON 到 JSON 模式:从样本有效负载到合约
在浏览器中将 JSON 转换为 JSON 模式:从真实有效负载推断草稿,然后强化所需的字段、格式和枚举 - 加上推断的限制。
5 分钟阅读
JSON 到 SQL:从有效负载到可查询的表
使用从真实有效负载生成的 CREATE TABLE 和 INSERT 语句,通过合理的类型映射、转义和诚实限制,将 JSON 转换为 SQL。
- 较长的文章可供阅读: JSON 至 TypeScript:说实话的类型