在给社区养老平台写健康监测模块时,碰上一个常见问题:该用 type 还是 interface?看起来都能定义对象结构,但实际用起来还是有差别的。
从一个血压记录功能说起
比如我们要存老人每天的血压数据,收缩压、舒张压、测量时间。用 interface 可以这样写:
interface BloodPressure {
systolic: number; // 收缩压
diastolic: number; // 舒张压
timestamp: Date;
}
而用 type 的写法差不多:
type BloodPressure = {
systolic: number;
diastolic: number;
timestamp: Date;
};
表面上看,两种方式都能达到目的。但区别藏在后续扩展里。
想加个心率字段怎么办?
如果哪天设备升级,要同时记录心率,interface 允许我们重新声明同名接口,自动合并:
interface BloodPressure {
heartRate?: number; // 可选的心率值
}
这时候原来的接口就自然多了个字段。但 type 不行,一旦定义就不能再扩展,重复定义会报错。
复杂点的情况:多种数据源混合
有的老人用手环,有的用独立血压计,数据格式不一样。这时候 type 更灵活,能直接做联合类型:
type DeviceData = {
source: 'bracelet';
hr: number;
} | {
source: 'monitor';
sys: number;
dia: number;
};
这种用 interface 就不好实现,得绕路去配合 type 使用。
实际开发中的小习惯
我现在一般默认用 interface,毕竟大多数情况都是定义对象结构,以后也好扩展。只有遇到联合、映射、条件类型这些复杂逻辑时,才换成 type。团队里其他人也这么干,代码看起来统一些。
就像给老人安排饮食,日常三餐按固定菜单来(interface),特殊情况临时加营养餐就得另开单子(type),各有各的用处。