写了个 fromJson<T> 工具函数,返回结果直接点字段,编辑器报 TS18046 'data' is of type 'unknown'。签名里 T 后面什么都没写,调用处也没传。日志里能对上时间点,这种反而好排。
调用时既没有类型实参,也没有多余参数能反推出 T,编译器就把 T 落到它的默认约束上。没写 extends 时约束是 unknown,任何属性访问都会被拦。这一点先确认清楚,后面就不用反复试。
function fromJson<T extends Record<string, unknown>>(s: string): T {
return JSON.parse(s) as T;
}
const d = fromJson<{ id: number }>('{"id":1}');
「泛型默认类型参数」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。
处理上按这个顺序:先给 T 加 extends 约束 限定它必须具备的字段形状;调用处显式写出类型参数 让返回值有具体结构;不想每次手写就设默认类型参数 但要选一个真实存在的形状。
结果对不对很好判断,TS18046 消失 悬停提示里是具体字段 不再显示 unknown。
