为何LSP错误识别parseAndValidate返回值类型?技术咨询
function parseAndValidate(obj: unknown): ParsedObj | void { try { // do a lot of validations return parsedObj } catch { throw new Error('obj is invalid') } } const parsedObj = parseAndValidate(obj)
疑问1:LSP将parsedObj识别为any类型的原因
核心原因是ParsedObj这个自定义类型未被正确声明(或声明不在当前作用域内)。TypeScript遇到未定义的标识符时会将其视为隐式any,此时函数返回类型ParsedObj | void会被推断为any | void,而TypeScript类型系统会直接将any与其他类型的联合类型简化为any,最终导致parsedObj被识别为any。
另外如果函数内部的parsedObj变量无类型注解且无法被推断出具体类型,也会被视为any,进一步影响返回类型的推断,但根源还是ParsedObj类型未正确定义。
疑问2:为何LSP不将parsedObj识别为ParsedObj类型
TypeScript的类型检查是静态分析,仅基于你声明的函数返回类型做判断,不会分析运行时逻辑。虽然你的catch块确实会抛出错误、不会返回值,但你给函数标注的返回类型是ParsedObj | void,TypeScript就会严格按照这个注解推断变量类型——它不会去判断catch块是否一定会抛出错误,只会认为函数可能返回ParsedObj或者void(无返回值)。
优化方案
不需要用as ParsedObj强制转换,两个更合理的解决方式:
- 先正确声明
ParsedObj类型:type ParsedObj = { /* 你的具体类型结构 */ }; - 修改函数返回类型,去掉
void——因为函数要么返回ParsedObj,要么直接抛出错误,不存在返回void的情况:function parseAndValidate(obj: unknown): ParsedObj { try { // do a lot of validations return parsedObj; } catch { throw new Error('obj is invalid'); } }
此时parsedObj的类型会被正确推断为ParsedObj。
内容的提问来源于stack exchange,提问作者Ooker
相关产品推荐
相关产品推荐

