Я пытаюсь написать функцию, которая принимает общий объект типа дерева, состоящий из узла типа children
, который, в свою очередь, может необязательно иметь свои собственные children
, второй аргумент - функция predicate
с посещенным в данный момент узлом для передачи его в функцию фильтра.
Меня не волнуют дополнительные свойства внутри tree
(за исключением children
) и node
подобных объектов.По этой причине я решил реализовать эту функцию с использованием обобщений.Ниже приведена упрощенная версия моего кода.
interface NodeLike {
children?: NodeLike[];
}
interface TreeLike {
children: NodeLike[];
}
export function filterChildrenFromTree<T extends TreeLike, N extends NodeLike>(
t: T,
predicate: (n: N) => boolean
): T {
const newTree = {
children: t.children.filter(predicate)
};
return newTree;
}
К сожалению, машинопись дает мне следующую ошибку в строке return
:
Type '{ children: NodeLike[]; }' is not assignable to type 'T'.
Если указать, что T
в этом случаерасширяет объект TreeLike, почему машинопись выдает сообщение, когда я возвращаю объект в ожидаемом формате?