根据条件创建子集联合类型。打字稿

时间:2018-02-09 11:42:44

标签: typescript union-types

我有以下Widget类型:

enum WidgetType {
  Page = "Page",
  Tab = "Tab",
  Value = "Value",
  Chart = "Chart"
}
type PageWidget = {
  type: WidgetType.Page;
  children: Widget[];
};
type TabWidget = {
  type: WidgetType.Tab;
  children: Widget[];
};
type ValueWidget = {
  type: WidgetType.Value;
};
type ChartWidget = {
  type: WidgetType.Chart;
};
type Widget = PageWidget | TabWidget | ValueWidget | ChartWidget;

基于此我想要创建新类型调用WidgetWithChildren,它必须是具有children属性的小部件的联合(在这种情况下是PageWidget和{{的并集1}}),但我想让它变得动态,所以当有一个带有孩子的新型Widget时,它会自动显示在TabWidget

我想要类似的东西:

WidgetWithChildren

TypeScript有可能吗?我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

如果您认为只依赖于您的需求,您应该能够使用界面满足您的需求。

interface HierarchicalWidget {
    children: Widget[];
}

// Example usage
function needsChildren(widget: HierarchicalWidget) {
    for (const child of widget.children) {
        console.log(child.type);
    }
}

具有children类型Widget[]的任何对象都可以满足此接口,无论它是否显式实现它。这允许您的代码依赖于HierarchicalWidget的概念,而无需了解具体实现,例如PageWidgetTabWidget