Интерфейс машинописного текста для древовидной структуры - PullRequest
0 голосов
/ 07 мая 2020

Я хочу определить интерфейс для древовидной структуры.

Каждый узел может иметь ноль или более дочерних узлов:

export interface TreeNode {
  children?: Array<TreeNode>;
}

Я реализовал функцию обхода для TreeNode s.

export function traverseTree(treeData: Array<TreeNode> | TreeNode, callback: (treeNode: any) => any) {
  // implementation omitted
}

Хочу протестировать. Код выглядит следующим образом:

const treeData = [
  {
    name: "root_1",
    children: [
      {
        name: "child_1",
        children: [
          {
            name: "grandchild_1"
          },
          {
            name: "grandchild_2"
          }
        ]
      }
    ]
  },
  {
    name: "root_2",
    children: []
  }
];
const traversingHistory = [];
const callback = (treeNode: any) => {
  traversingHistory.push(treeNode.name);
}
traverseTree(treeData, callback);

Однако компиляция не выполняется, потому что аргумент типа treeData не может быть применен к traverseTree.

Я не хочу добавлять атрибут name к интерфейсу TreeNode, потому что узел дерева может иметь динамические c свойства. Как я могу изменить интерфейс TreeNode, чтобы он принимал более общие типы?

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Вероятно, вы получаете следующую ошибку:

Литерал объекта может указывать только известные свойства, а 'name' не существует в типе

Если вы хотите разрешить другие ключи, он должен быть частью типа. Вы можете сделать это с помощью подписи индекса:

export interface TreeNode {
  [key: string]: any // type for unknown keys.
  children?: TreeNode[] // type for a known property.
}
0 голосов
/ 07 мая 2020

Попробуйте использовать этот тип объединения с object:

type TreeNode = {
    children?: Array<TreeNode>;
} & object;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...