TypeScript 如何做类类型约束

日常写代码时,我们常会遇到“明明传了参数,却还是报错”的情况,很多时候不是参数内容错了,而是参数的类型不符合预期。比如做电商项目时,写了个计算商品总价的函数,结果不小心把库存数传成了字符串,函数就会算出奇怪的结果。这时候,TypeScript 的类类型约束就能帮我们提前堵住这类漏洞。

先搞懂:类类型约束到底是啥

不用记复杂术语,你可以把类当成“模板”——做衣服时,模板规定了这件衣服有几个口袋、用什么材质。类类型约束,就是让传入的某个对象,必须符合这个模板的要求,不能随便乱传。

TypeScript 如何做类类型约束

举个生活化的例子:你订了一杯奶茶,要求“必须是带奶盖的中杯珍珠奶茶”,这就是你对奶茶的“类型约束”——不符合这个要求的奶茶,你不会要。类类型约束的逻辑就是这样:给变量、函数参数定好“模板规则”,不符合的就直接报错,不用等运行时才出问题。

最常用的两种类类型约束方法

做类类型约束,有两种最实用的方式,覆盖日常90%的场景,用起来都很简单。

第一种是“用类直接约束”:把类本身当成类型,让变量或参数必须是这个类的实例。比如你做一个宠物管理功能,定义了Pet类,要求传入的必须是这个类的实例。

举个代码例子:

`typescript

// 定义宠物类,规定了必须有name和age属性

class Pet {

name: string;

age: number;

constructor(name: string, age: number) {

this.name = name;

this.age = age;

}

}

// 函数参数约束为Pet类,只能传Pet实例

function feedPet(pet: Pet) {

console.log(喂${pet.name},它${pet.age}岁了);

}

// 正确:传Pet实例,符合约束

const myDog = new Pet("旺财", 3);

feedPet(myDog);

// 错误:传了普通对象,没有Pet类的实例特征,直接报错

feedPet({ name: "咪咪", age: 2 });

`

这种方法适合“必须是这个类的后代”的场景,比如喂宠物,就必须是宠物类的实例,不能随便传别的东西。

第二种是“用接口约束结构”:如果不想限制必须是某个类的实例,只要求“长得像这个样子”,就用接口。接口只看对象的结构,不管它来自哪个类。比如你做一个商品结算功能,要求传入的对象必须有id和price两个属性,不管它是从商品类来的,还是从购物车项来的,只要结构对就行。

举个代码例子:

`typescript

// 定义商品接口,规定必须有id和price属性

interface Goods {

id: number;

price: number;

}

// 函数参数约束为Goods接口,只要有id和price就可以

function calcTotal(item: Goods) {

return item.price;

}

// 正确:普通对象符合接口结构

const phone = { id: 1, price: 3999 };

calcTotal(phone);

// 错误:缺了price属性,直接报错

calcTotal({ id: 2 });

`

这种方法更灵活,适合只看对象功能的场景,比如计算商品总价,只要有商品的必要信息就行,不用管它是不是商品类的实例。

写约束时要注意的小细节

用类类型约束时,有两个小坑要避开,不然容易出错。

第一个是可选属性的处理:如果属性不是必须的,要加?标记,比如宠物可以没有昵称,就写nickname?: string,这样传参数时可以不写这个属性,不会报错。

第二个是只读属性的使用:如果某个属性不能被修改,比如商品的id,可以加readonly标记,写readonly id: number,这样就不会不小心改了商品编号。

简单来说,类类型约束就是给代码设“规则”,提前把不符合要求的内容拦在外面,不用等运行时再找bug,写代码时就知道哪里错了。日常开发中,根据场景选类或者接口做约束,就能轻松搞定大部分类型问题,让代码更稳。

上一篇 Swift编程语言核心特性与实际应用场景知识科普