TypeScript接口实现propA与propB二选一必填及类型不兼容报错咨询
问题原因
这里存在两个核心问题:
- 类型不匹配报错的逻辑:你定义的
final是A | B联合类型,它的值可能是A也可能是B,而somethingCalled函数只接收A类型参数,未做类型校验的前提下TS会判定类型不兼容,触发报错。 - 原有二选一接口的漏洞:当前的
A | B定义允许对象同时存在propA和propB,因为同时包含两个属性的对象同时符合A和B的接口规则,不会触发报错,不符合“仅包含其中一个属性”的要求。
解决方案
1. 完善互斥属性的接口定义(可选,若需要严格二选一)
如果要求propA和propB严格互斥、不能同时存在,优化类型如下:
interface ABC { propC: string propD?: string } interface A extends ABC { propA: string propB?: never // 明确不允许出现propB } interface B extends ABC { propB: string propA?: never // 明确不允许出现propA } export type final = A | B
2. 解决调用报错,根据你的实际场景选对应方案即可:
- 方案一:你确认当前
b一定是A类型,直接用类型断言
somethingCalled(b as A)
- 方案二:函数本身可兼容处理
A或B类型,修改函数参数类型
function somethingCalled (a: final) { // 函数内部可通过属性判断做分支逻辑 if ('propA' in a) { // 处理A类型的逻辑 } else { // 处理B类型的逻辑 } }
- 方案三:函数仅能处理
A类型,调用前先做类型收窄
const b:final = req.body if ('propA' in b) { // 此时TS会自动推导b为A类型,不会报错 somethingCalled(b) }
内容的提问来源于stack exchange,提问作者Alwaysblue
相关产品推荐
相关产品推荐

