首页 > 解决方案 > 主题的可选参数

问题描述

我的 Angular 服务中有一个主题,

itemClicked: Subject<MenuTab | MenuLaunchTab, MenuItem>;

问题是,我只想MenuItem 作为MenuTab第一个参数传递时传递,而当第一个参数是.MenuLaunchTab

我想复制我们对函数参数所做的事情:

function(tab: MenuTab | MenuLaunchTab, item?: MenuItem)

标签: angulartypescriptrxjssubject

解决方案


您需要结合使用这两种类型而不是联合使用。

itemClicked: Subject<MenuTab, MenuItem> & Subject<MenuLaunchTab>;

现在itemClicked支持两者Subject<MenuTab, MenuItem>Subject<MenuLaunchTab>但既不支持Subject<MenuTab>也不支持Subject<MenuLaunchTab, MenuItem>

一个函数应该联合所有可能的覆盖类型。不幸的是,这意味着除了

function(tab: MenuTab | MenuLaunchTab, item?: MenuItem)

您可以做的是在开始时检测类型,然后拆分您的流程。

function(tab: MenuTab | MenuLaunchTab, item?: MenuItem) {
  // or other check that fits, because their definition is unclear.
  const menuLaunchTab: MenuLaunchTab | undefined = item ? undefined : tab;
  const menuTab: MenuTab | undefined = item ? tab : undefined;
  if (menuTab) {
    handlerOfmenuTab(menuTab, item);
  } else if (menuLaunchTab) {
    handlerOfmenuLaunchTab(menuLaunchTab);
  }

}

推荐阅读