如何优雅更新TypeScript可选对象属性?以AircraftInfo的pos为例
优化TypeScript中AircraftInfo的pos属性更新逻辑
你定义的TypeScript接口如下:
export interface AircraftInfo { timestamp: Date icao: string ident?: { callsign: string } pos?: { lat: number lon: number altitude: number } }
原更新pos的逻辑可以通过以下几种更简洁的方式实现:
方式一:原地修改(保持原pos引用)
利用空值合并赋值运算符??=简化判断,直接修改内部属性:
// 若pos不存在则先初始化空对象,再更新属性 info.pos ??= {}; info.pos.lat = lat; info.pos.lon = lon; info.pos.altitude = altitude;
??=会在info.pos为undefined或null时才赋值空对象,之后直接更新三个属性即可,完全替代原有的if-else逻辑。
方式二:创建新对象替换pos
如果允许替换原pos对象(不要求保持引用),可以用对象展开运算符:
info.pos = { ...info.pos, lat, lon, altitude };
展开运算符会把现有pos的属性全部复制,再覆盖传入的新属性。若pos原本不存在,展开undefined会被忽略,自动生成包含三个属性的新对象。
方式三:使用Object.assign合并属性
和方式二逻辑类似,通过Object.assign实现属性合并:
info.pos = Object.assign(info.pos ?? {}, { lat, lon, altitude });
info.pos ?? {}确保合并的目标对象存在,再把新属性合并进去,最终赋值给info.pos。
选择建议
- 若需要保持原pos对象的引用(比如其他地方还在引用该对象),优先选方式一,和原逻辑行为完全一致且代码更简洁。
- 若不需要保持引用,方式二的写法最简洁直观。
内容的提问来源于stack exchange,提问作者Kon
相关产品推荐
相关产品推荐

