function parse<T = unknown>(s: string): T {
  return JSON.parse(s) as T;
}
const r = parse<{ data: string }>('{}');

封装了一个通用的解析函数,调用后想直接读结果里的字段,编辑器报 TS2339,鼠标悬上去才发现整个返回值被推成了 unknown,任何属性都取不到。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:泛型参数没给默认值也没加约束,调用时又不传类型实参,编译器只能按最宽的类型处理;unknown 不允许直接访问成员,除非先断言或者做类型守卫。

围绕「泛型返回值 unknown」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。同一份配置存在多处的,先确认改的是被加载的那一份。

处理上按这个顺序:给泛型加上约束,限定它必须满足的形状范围;调用时显式把期望的返回类型作为参数传进去;在函数内部先做一次类型断言收窄再返回结果。

确认没问题再收工,结果字段能直接点出来,悬停提示里显示的是具体结构,不再是宽泛类型。

作者 9823189