TypeScript基于子字段/元数据类型的判别式联合类型收窄问题
TypeScript嵌套判别式联合的类型收窄解决方案
你的代码首先存在拼写错误:inferface应改为interface。除此之外,核心问题是TypeScript对嵌套在对象中的判别属性自动类型收窄支持有限,可通过以下两种方式解决:
方案一:自定义类型守卫函数
手动编写类型守卫,明确告知TypeScript如何判断联合类型的成员:
interface NumberResponse { metadata: { response_type: 'number'; }; value: number; } interface BooleanResponse { metadata: { response_type: 'boolean'; }; value: boolean; } type Response = NumberResponse | BooleanResponse; // 类型守卫函数 function isBooleanResponse(res: Response): res is BooleanResponse { return res.metadata.response_type === 'boolean'; } function isNumberResponse(res: Response): res is NumberResponse { return res.metadata.response_type === 'number'; } // 使用示例 let response: Response; if (isBooleanResponse(response)) { let value = response.value; // 类型自动收窄为boolean } if (isNumberResponse(response)) { let value = response.value; // 类型自动收窄为number }
方案二:解构判别属性到顶层(TS 4.4+)
将嵌套的response_type解构为顶层变量,帮助TypeScript跟踪类型并完成收窄:
let response: Response; const { response_type } = response.metadata; if (response_type === 'boolean') { let value = response.value; // 类型自动收窄为boolean } if (response_type === 'number') { let value = response.value; // 类型自动收窄为number }
原因说明
TypeScript的自动类型收窄逻辑对顶层判别属性支持最佳,当判别属性嵌套在子对象中时,TS的类型推断引擎需要更明确的提示——要么通过类型守卫函数直接断言类型,要么通过解构将属性提升到顶层,让TS能关联变量类型与联合成员的对应关系。
内容的提问来源于stack exchange,提问作者Jonathan Woolf
相关产品推荐
相关产品推荐

