TypeScript类型检查:验证未知对象嵌套键时的报错解析
解决TypeScript类型谓词函数中
Property result does not exist on type 'object'错误 错误原因
你遇到的报错是因为TypeScript的代码流分析无法识别object包含result属性:虽然你前面通过类型断言检查了(object as Record<string, any>).result,但这种方式不会让TypeScript把object的类型窄化为带result的结构。当后续直接写object.result时,object的类型仍被判定为泛化的object类型,因此触发“result属性不存在”的错误。
修复方案
方案一:分步存变量,明确类型跟踪
通过将中间结果存入变量,让TypeScript能清晰跟踪每一步的类型变化,同时用更准确的数组检查替代typeof === "object"(因为数组的typeof结果也是object):
let objectKeyCheck = ( object: unknown ): object is { result: { items: object[] } } => { // 先排除非对象情况 if (!object || typeof object !== "object") return false; // 将对象断言为任意键类型,存入变量 const obj = object as Record<string, any>; // 检查result存在且为对象 if (!obj.result || typeof obj.result !== "object") return false; // 检查items存在且为数组 return !!obj.result.items && Array.isArray(obj.result.items); };
方案二:用in操作符做类型守卫
通过in操作符明确检查属性是否存在,让TypeScript自动窄化类型:
let objectKeyCheck = ( object: unknown ): object is { result: { items: object[] } } => { // 排除null和非对象 if (typeof object !== "object" || object === null) return false; // 检查result属性是否存在 if (!("result" in object)) return false; const obj = object as { result: unknown }; // 排除result为非对象的情况 if (typeof obj.result !== "object" || obj.result === null) return false; // 检查items属性是否存在 if (!("items" in obj.result)) return false; const result = obj.result as { items: unknown }; // 验证items是数组 return Array.isArray(result.items); };
关键说明
两种方案的核心都是让TypeScript获得足够的类型信息,确认object及其嵌套属性的存在性与类型。相比直接嵌套断言,分步处理不仅能消除报错,还让代码逻辑更清晰、可读性更强。
内容的提问来源于stack exchange,提问作者Wayne
相关产品推荐
相关产品推荐

