Typescript依赖可选属性定义问题:联合类型校验失效如何解决?
方案存在的问题
TypeScript 的对象类型默认是开放结构,不会限制额外属性的存在。你定义的T接口仅要求对象必须包含a、b两个属性,对其他属性没有限制。因此当你传入{a, b, c}时,TypeScript 会判定它符合T的类型要求,自然不会抛出错误。
实现需求的方案
你需要将联合类型的分支定义为密封结构,也就是显式规定不允许存在的属性类型为never:
// 工具类型:将传入类型的所有属性转为可选 never 类型 type AllOrNothing<U> = { [K in keyof U]?: never } interface T { a: any, b: any } interface U { c: any, d: any } // 两种合法情况:要么完全没有 U 的属性,要么包含 U 的全部属性 type V = (T & AllOrNothing<U>) | (T & U)
验证效果
- 合法场景:
// 仅包含 a、b,合法 const v1: V = { a: 1, b: 2 } // 同时包含 a、b、c、d,合法 const v2: V = { a: 1, b: 2, c: 3, d: 4 } - 非法场景:
// 仅包含 c 缺失 d,会直接抛出类型错误 const v3: V = { a: 1, b: 2, c: 3 }
如果需要更通用的封装,可以进一步提取工具类型:
type AllOrNothing<U> = { [K in keyof U]?: never } type RequiredGroup<T, G> = T & (G | AllOrNothing<G>) // 直接使用即可 type V = RequiredGroup<T, U>
内容的提问来源于stack exchange,提问作者Yoba Yoba
相关产品推荐
相关产品推荐

