接口字段名和后端对不上,为了消掉 TS2322 写了一行 as unknown as Order,编译马上通过,页面上金额那一栏显示的却是订单号。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
const raw: unknown = await res.json();
const o = raw as { order_no: string; pay_amount: string };
return { id: o.order_no, amount: Number(o.pay_amount) } as Order;
双断言先把类型抹成 unknown 再声明成目标类型,中间不做结构比较,编译器没有依据可以判断。类型对了编译就过,运行时数据还是原来那一份。这一点先确认清楚,后面就不用反复试。
「双重类型断言」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。
具体做法是,先把真实返回结构打印出来 和声明逐字段比对;在边界处写一个转换函数 把后端字段映射成前端类型;转换函数里校验关键字段 缺失直接抛错;把双断言在 lint 里标成错误 禁止新增。
改完照着核一遍,页面字段和接口对得上 双断言数量清零 缺字段时能拿到明确报错。
