TypeScript 如何做键值约束

你有没有过写 JavaScript 时,明明给对象存了数据,调用时却因为键名写错、类型不对,冒出莫名其妙的报错?比如把用户信息的对象里,误把"age"写成"Age",或者把数字的年龄存成字符串,运行到某一步才发现问题。其实只要换成 TypeScript,这些问题能提前在代码编写阶段就被拦住——这就要用到它的键值约束功能,简单说就是给对象的键和值都加上“规矩”。

先搞懂最基础的“键的范围”

假设你要做一个记录水果库存的小工具,水果只有苹果、香蕉、橙子三种,你不想让用户随便加别的水果到库存里。用 TypeScript 可以这样写:

TypeScript 如何做键值约束

`typescript

type Fruit = '苹果' | '香蕉' | '橙子';

type Stock = {

[key in Fruit]: number;

};

const myStock: Stock = {

苹果: 10,

香蕉: 15,

橙子: 8

};

`

这里的Fruit是一个只允许三个值的类型,而Stock里的[key in Fruit]就是约束键——意思是“这个对象的键只能是这三个,别的不行”。如果试着加一个草莓: 5,代码会直接报错,告诉你“草莓不在允许的键列表里”。这种约束就像给对象安了个“门禁”,只有指定的键能进来。

再给值定好“规矩”

光管住键还不够,万一苹果的库存存成了“十斤”这种字符串,代码算库存总和时会直接出问题。TypeScript 能同时约束值的类型,还是用刚才的库存例子,刚才的Stock里number就是值的约束,意思是“每个键对应的数值必须是数字”。

`typescript

const wrongStock: Stock = {

苹果: '十斤', // 报错:类型“string”不能赋值给类型“number”

香蕉: 15,

橙子: 8

};

`

如果值的类型不是数字,哪怕键对了也会报错。要是你想让库存允许数字或者“缺货”这种字符串,也能改:把值的类型写成number | '缺货',这样既能存数字,也能存特殊状态,键依然只能是那三种水果,相当于同时给钥匙和锁芯都定了规则。

更灵活的场景:可选键或额外键

有时候你需要部分键可选,或者允许加几个不在列表里的额外键。比如水果库存里偶尔会有临时加的“车厘子”,但主要还是那三种,就可以用Partial和索引签名结合:

`typescript

type BasicFruit = '苹果' | '香蕉' | '橙子';

type FlexibleStock = {

[key in BasicFruit]?: number;

[extraKey: string]: number;

};

const flexible: FlexibleStock = {

苹果: 10,

车厘子: 20 // 允许额外键

};

`

这里?表示键是可选的,比如可以不写橙子的库存;而第二个[extraKey: string]就是额外键的约束,只要值是数字,不管键叫什么都能加,适合需要兼顾固定规则和临时扩展的场景。

其实 TypeScript 的键值约束,本质是把运行时的错误提前到了写代码的时候,就像给笔记本加了索引贴,既能保证分类清晰,又能避免写错标签。日常做用户信息、商品列表这种对象时,用这套规则能少踩80%的低级错误,代码也更容易维护。

上一篇 JavaScript 字符串怎么替换