TypeScript将合并接口生成的交叉类型判定为never类型问题排查
问题根本原因
你当前对OrganizationAccount使用了**交叉类型(&)**定义,交叉类型的语义是该类型的实例必须同时满足所有参与交叉的接口约束,也就是说按照你现有定义,所有OrganizationAccount类型的对象天生就必须包含account_type这个必填属性。
TypeScript会默认'account_type' in account的判断永远为真,因此!('account_type' in account)分支是不可能进入的死分支,分支内的变量自然会被推导为never类型。
另外你首次API请求返回的只有Account接口的属性,直接赋值给OrganizationAccount类型的变量本身就不符合交叉类型的约束,属于隐式的类型不匹配。
修复方案
你的业务场景是账户对象的属性会逐步填充,因此应该用联合类型来描述两种不同的状态:仅包含基础属性的初始状态、加载完详情的完整状态。
修改后的类型定义如下:
interface Account { name: string; created_on: string; } interface DetailedAccount { account_type: string; status: string; } interface AccountSelection { isSelected?: boolean; } // 联合类型:要么是仅带基础信息的账户,要么是带详情的完整账户 type OrganizationAccount = (Account & AccountSelection) | (Account & DetailedAccount & AccountSelection);
修改后TypeScript就能正确识别OrganizationAccount可能不存在account_type属性,!('account_type' in account)分支内的account会被正确缩窄为Account & AccountSelection类型,不会再被判定为never,原有业务逻辑不需要做其他修改即可正常运行。
内容的提问来源于stack exchange,提问作者LazioTibijczyk
相关产品推荐
相关产品推荐

