判别式联合的交集行为异常,如何定义类型C使所有示例合法?
解决方案:重新定义联合类型覆盖所有合法场景
原类型C = A & B的交集仅包含A、B各自联合分支的交叉组合,而{a: boolean}、{b: boolean}这类赋值无法匹配任何交叉分支——因为A的分支中a只能是true或可选的false,B的分支中b只能是true或可选的false,均不包含boolean类型的属性值,因此触发TypeScript错误。
要让所有示例赋值合法,需重新定义C为覆盖所有合法场景的联合类型,明确将需要允许的{a: boolean}、{b: boolean}等情况纳入分支:
type A = { a: true } | { a?: false } type B = { b: true } | { b?: false } type C = | {} | { a: true } | { b: false } | { a: true; b: false } | { a: boolean } | { b: boolean } | { a: boolean; b: boolean }; // 所有赋值均合法 let c: C = {} c = { a: true, } c = { b: false, } c = { a: true as boolean, b: false as boolean } c = { a: true as boolean, } c = { b: false as boolean }
每个赋值对应的匹配分支:
{}→ 匹配{}分支{a: true}→ 匹配{a: true}分支{b: false}→ 匹配{b: false}分支{a: true as boolean, b: false as boolean}→ 匹配{a: boolean; b: boolean}分支{a: true as boolean}→ 匹配{a: boolean}分支{b: false as boolean}→ 匹配{b: boolean}分支
内容的提问来源于stack exchange,提问作者Dzmitry Shuhayeu
相关产品推荐
相关产品推荐

