TypeScript可辨识联合类型:枚举值为Widget时未强制widget属性
解决TypeScript可辨识联合类型的属性校验问题
你当前的问题出在第一个联合分支的path用了整个Sections枚举,导致Sections.Widget也能匹配这个分支——因为这个分支里widget是可选的never,不传widget时完全符合该分支的类型约束,所以TypeScript不会报错。
要实现正确的属性组合校验,只需要把第一个分支的path范围限定为排除Sections.Widget之外的枚举值,用TypeScript的Exclude工具类型即可:
export type ReduxLocation = | { // 只允许非Widget的Sections枚举值 path: Exclude<Sections, Sections.Widget>; widget?: never; } | { path: Sections.Widget; widget: { id: string; side?: "left" | "right"; }; };
修改后:
- 当
path为Sections.Dashboard或Sections.Select时,只能匹配第一个分支,此时widget必须是undefined(传了就会报错,符合你的预期); - 当
path为Sections.Widget时,只能匹配第二个分支,此时widget是必填属性,不传就会触发TypeScript错误,正好满足你的需求。
现在再测试你的组件实例,最后那个未传widget的Sections.Widget场景会正确报错。
内容的提问来源于stack exchange,提问作者Seth Lutske
相关产品推荐
相关产品推荐

