interface User {
  id: number; name: string; avatar?: string;
}
const u = resp.data as User;
console.log(Object.keys(resp.data));

接口返回的对象里确实存在 avatar 这个字段,取值时编辑器报 TS2339 Property ‘avatar’ does not exist on type ‘User’,在控制台打印出来这个键又明明白白躺着。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,类型声明和真实数据结构是两份东西,接口里少写一个字段编译器就认为它不存在,后端加了字段而声明没跟着改,取值这一步必然报错。

围绕「TS2339 属性不存在」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

处理上按这个顺序:打印真实返回的对象 和声明逐字段比对一遍;把漏掉的字段补进接口声明 并把它标注成可选;外部接口的数据先用 unknown 收一次再断言。

改完只确认一件事:取值不再报 TS2339,字段缺失时可选标记能兜住,取到空值也有提示。

作者 9823189