You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 07:15:35