Создайте тип объединения подмножества на основе условия. Машинопись

У меня есть следующий тип 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 и TabWidget), но я хочу сделать его динамическим, поэтому при появлении нового Тип виджета с детьми будет автоматически в WidgetWithChildren.

Я хочу что-то вроде:

type WidgetWithChildren = Pick<Widget, "take widgets children">;

Возможно ли это в TypeScript? Как я могу это сделать?


person Konrad Klimczak    schedule 09.02.2018    source источник


Ответы (1)


Если вы мыслите с точки зрения зависимости только от того, что вам нужно, вы сможете удовлетворить свои потребности с помощью интерфейса.

interface HierarchicalWidget {
    children: Widget[];
}

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

Любой объект, который имеет children типа Widget[], может удовлетворять этому интерфейсу, вне зависимости от того, реализует он его явно или нет. Это позволяет вашему коду зависеть от концепции HierarchicalWidget, не зная о конкретных реализациях, таких как PageWidget или TabWidget.

person Fenton    schedule 09.02.2018