Tips for incorporating an interface into a tree structure

In my project, I have a structured TableOfContents system:

export interface TableOfContents {
  id: number;
  title: string;
  isExpanded: boolean;
  children: TableOfContents[];
}

To implement a search function for finding an item in an array of trees and make it generic, I made the following adjustments:

export interface TreeNode {
  [key: string]: any;
  children?: TreeNode[];
}

export interface TableOfContents extends TreeNode {
  id: number;
  title: string;
  isExpanded: boolean;
}

export const findInTrees = <TreeType extends TreeNode>(
  trees: TreeType[],
  callback: (el: TreeType) => boolean
): TreeType | null => {
  const tree = trees.find(tree => callback(tree));
  if (tree) {
    return tree;
  }
  for (const tree of trees) {
    if (tree.children) {
      const result = findInTrees(tree.children, callback);
      if (result) {
        return result;
      }
    }
  }
  return null;
};

However, I encountered an error

TS2345: Argument of type 'TreeNode[]' is not assignable to parameter of type 'TreeType[]'.
on the line
const result = findInTrees(tree.children, callback);

I would appreciate your assistance in finding a solution to this issue.

Answer №1

When defining your TreeNode interface, make sure to clarify that the children property should be an array containing elements of the exact same type as the parent TreeNode. To achieve this, you can use the this type as follows:

export interface TreeNode {
  [key: string]: any;
  children?: this[];
}

Answer №2

define type Tree<N = any> = N & {
    branches: Array<Tree<N>>;
}

const hierarchy: Tree<{title?: string}> = {
    title: 'Alex',
    branches: []
};

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

Issue with the scoring algorithm using Angular and Spring Boot

Hello, I have created a scoring algorithm to calculate scores, but I encountered an error in "salaireNet". ERROR TypeError: Cannot read properties of null (reading 'salaireNet') at ScoringComponent.calculateScore (scoring.component.ts:33:55) ...

Angular: Implementing default nested routes

I am currently facing a challenge with routing in my Angular application. I have set up a page within a router-output on the route /products. This page contains another router-output which will display one of two possible children routes (/products/profess ...

Tips for transferring the "close" function from a modal template to the HTML of another component in Angular 5

Recently, I started learning angular 4 and I need some assistance with a specific issue. I have a component that contains a modal template. Component :- import {Component} from '@angular/core'; import {NgbModal, ModalDismissReasons} from &apos ...

Issue with Material UI: Unable to utilize import statement outside of a module due to Select dependency

Hello there! Here is my query: I am currently working on a project using NextJS + React with node. Everything seems to be running smoothly, except for one issue I encounter when reloading a page with a Select component from Material UI. The relevant code ...

When a URL is triggered via a browser notification in Angular 2, the target component ceases to function properly

Whenever I access a URL by clicking on a browser notification, the functionality of the page seems to stop working. To demonstrate this issue, I have a small project available here: https://github.com/bdwbdv/quickstart Expected behavior: after starting t ...

Using variables within the useEffect hook in ReactJS

I am currently working on a project using Reactjs with Nextjs. I am facing an issue where I need to retrieve the value of "Editor" and alert it inside the handleSubmit function. Can anyone help me with how to achieve this? Here is my code snippet, any as ...

What is the recommended TypeScript type for the NextJS _app.tsx Component and pageProps?

Take a look at the default _app.tsx code snippet from NextJS: function MyApp({ Component, pageProps }) { return ( <Component {...pageProps} /> ) } The issue arises when transitioning to TypeScript, as ES6Lint generates a warning indicating t ...

The JsonFormatter is throwing an error because it is trying to access the property 'on' of an undefined variable

I have encountered an error while attempting to generate an HTML report using cucumber-html-reporter The error message is: Unhandled rejection TypeError: Cannot read property 'on' of undefined at new JsonFormatter (C:\path-to-project\ ...

Search through an array of objects and assign a new value

I am facing a challenge with an array of objects structured as shown below: [ { "e_id": "1", "total": 0 }, { "e_id": "3", "total": 0 } ] My objecti ...

Trigger a table refresh to display updated information

When I select the select option to make an API call for a new datasource, my table appears before fetching data and it remains empty. Additionally, if I choose another select option, it displays the previous data from the previous selection. I have attemp ...

typescript code may not display a preview image

I recently came across a helpful link on Stack Overflow for converting an image to a byte array in Angular using TypeScript Convert an Image to byte array in Angular (typescript) However, I encountered an issue where the src attribute is not binding to t ...

Develop a custom function in Typescript that resolves and returns the values from multiple other functions

Is there a simple solution to my dilemma? I'm attempting to develop a function that gathers the outcomes of multiple functions into an array. TypeScript seems to be raising objections. How can I correctly modify this function? const func = (x:number, ...

Unlocking the potential of styled-components by enhancing props and distributing them to children components

I'm currently puzzled trying to figure out how to enhance styled components to pass a couple of props to its children while ensuring proper linting with TypeScript. Here's what I currently have: // ButtonBase.tsx export const ButtonBase = styled ...

Learn how to hide the dropdown menu in Angular 8 by detecting clicks outside of the menu area

Is there a way to hide the custom dropdown menu whenever I click outside of it? After trying the code below, I noticed that it hides even if I click on an element inside the dropdown menu: <button class="btn btn-primary btn-sm mt-1" type="button" id= ...

Passport.js consistently returns an unauthorized status for every request, even when a valid token is provided, or it author

I am facing issues with my Passport.js functions not authenticating users properly. When I use the current form, it always returns "unauthorized" for all requests: import passport from 'passport' import passportJWT from 'passport-jwt' ...

Using styled-components and typescript to override props

Currently, I am faced with the challenge of using a component that necessitates a specific property to be set. My goal is to style this component with the required property already defined, without having to manually specify it again during rendering. Howe ...

Wrapper for Material UI - leverage TypeScript types for a specific property

Apologies if this question has been addressed previously as I was unable to locate an answer. Currently, the app I am developing utilizes a wrapper for certain material-ui components. For example, I have a MyCompanyButton component which acts as a wrapper ...

Resolving Node.js Absolute Module Paths with TypeScript

Currently, I am facing an issue where the modules need to be resolved based on the baseUrl so that the output code is compatible with node.js. Here is my file path: src/server/index.ts import express = require('express'); import {port, database ...

AngularJS2 brings a powerful and seamless implementation of indexedDB for efficient

I'm on the hunt for an indexeddb implementation that works seamlessly with Angularjs2. While I stumbled upon this api at https://github.com/gilf/angular2-indexeddb, it appears to be lacking in active development and may not be ready for production use ...

Exploring the use of generic types in TypeScript interfaces

I have the following two interfaces: export interface TestSchema<S> { data: S; description: string; } export type someType = 'option1' | 'option2'; export interface AnotherInterface { primary: string; secondary: someType; ...