TypeScript 如何做 JSON 类型

在日常开发中,我们经常要处理接口返回的 JSON 数据、本地存储的 JSON 配置,有时候还得自己生成标准的 JSON 结构。这些场景里,如果数据格式错了,轻则功能出 bug,重则导致整个页面崩溃。那有什么办法能提前发现问题呢?这时候 TypeScript 就能帮上大忙——它能给 JSON 加上“类型保镖”,让你在写代码时就知道什么样的 JSON 才是合法的。

先搞懂:为什么要给 JSON 加类型

举个生活化的例子:你点外卖备注“少放辣”,商家能理解,但如果备注写成“少放××(不明符号)”,厨房肯定搞错。JSON 就像这个备注,本身是“无类型”的纯文本,你得告诉 TypeScript“这个 JSON 应该长什么样”,它才会帮你盯着:比如订单的“总价”必须是数字、“收货人”必须是字符串,要是哪天接口返回的“总价”变成了“一百块”这种文字,TypeScript 会立刻报错,不会等用户发现页面付款按钮点不了才出问题。

TypeScript 如何做 JSON 类型

最实用的3种给 JSON 加类型的方法

用接口(Interface)定义 JSON 的结构

这是最常用的方式,适合大多数普通 JSON。比如你要处理一个用户信息的 JSON,它应该有“姓名”“年龄”“是否会员”这三个字段,就可以这么写:

`typescript

// 定义一个符合用户JSON的接口

interface UserJson {

name: string; // 姓名是字符串

age: number; // 年龄是数字

isVip: boolean; // 是否会员是布尔值

}

// 把接口套到JSON数据上

const userData: UserJson = {

name: "小明",

age: 28,

isVip: true

};

`

如果哪天不小心把age写成字符串"28",TypeScript 会直接标红报错,提醒你格式不对,不用等到运行才找问题。

用类型别名(Type Alias)应对复杂场景

如果 JSON 结构有嵌套、或者可选字段,用类型别名会更灵活。比如用户的 JSON 里还有“收货地址”这个嵌套对象,而且可能没填(可选):

`typescript

// 用类型别名定义嵌套结构

type AddressJson = {

city: string;

street: string;

};

type UserJson = {

name: string;

age: number;

address?: AddressJson; // 加?表示这个字段可选,不是必须的

};

// 可以省略可选的address字段

const userData: UserJson = {

name: "小红",

age: 25

};

`

这种方式特别适合处理多层嵌套的复杂 JSON,比单独写多个接口更简洁。

用泛型(Generic)处理批量的 JSON 数据

如果要处理一批结构相同的 JSON,比如接口返回10个用户的列表,用泛型能让代码更通用。比如:

`typescript

// 定义一个通用的列表类型,里面的每个元素都符合UserJson

type UserListJson = {

list: UserJson[]; // 数组里的每一项都是UserJson

total: number; // 总条数

};

// 符合这个结构的JSON数据就不会错

const userList: UserListJson = {

list: [

{ name: "小刚", age: 30, isVip: false },

{ name: "小丽", age: 26, isVip: true }

],

total: 2

};

`

要是你想把用户列表换成商品列表,只要把泛型里的UserJson换成GoodsJson就行,不用重新写一整套结构定义。

注意2个容易踩的小坑

第一,不要直接用JSON.parse后的any类型。很多人图省事,直接写const data: any = JSON.parse(response),这样 TypeScript 就失去了类型检查的作用,等于白加了类型。第二,可选字段不要乱用undefined,比如如果某个字段真的可能不存在,一定要加?标记,而不是写成age?: number | undefined,前者更简洁规范。

给 JSON 加上 TypeScript 类型,本质是提前给数据“签合同”——你告诉 TypeScript 数据该长什么样,它就会全程盯着,帮你挡住绝大多数格式错误,让开发少踩坑、代码更稳。

上一篇 JavaScript 可选链怎么用