What is the proper data structure for an array containing a generic interface?

How can I specify the correct type for routes array in order to prevent the error:

TS2314: Generic type 'Route ' requires 1 type argument(s).

View code in TypeScript playground

interface Route<T> {
  path: string
  handler: () => T
}

class Router {
  routes: Route[] = []

  addRoute<T>(path: string, handler: Route<T>['handler']) {
    this.routes.push({
      path,
      handler
    })
  }
}

const router = new Router()
router.addRoute<string>('home', () => '123')

Answer №1

Check out the Typescript Playground here!

interface Route<T> {
  path: string
  handler: () => T
}

class Router {
  routes: Route<unknown>[] = []

  addRoute<T>(path: string, handler: Route<T>['handler']) {
    this.routes.push({
      path,
      handler
    })
  }
}

const router = new Router()
router.addRoute('foo', () => '123')
router.addRoute('bar', () => 123)

// or

class Router2<T> {
  routes: Route<T>[] = []

  addRoute(path: string, handler: Route<T>['handler']) {
    this.routes.push({
      path,
      handler
    })
  }
}

const router2Str = new Router2<string>()
router2Str.addRoute('baz', () => '123')

const router2Num = new Router2<number>()
router2Num.addRoute('quiz', () => 123)

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

Controlling the Output in Typescript without Restricting the Input

I am interested in passing a function as a parameter, allowing the function to have any number of parameters but restricting the return type to boolean. For example, a function Car(driver: Function) could be defined where driver can be ()=>boolean or ( ...

Limit choosing to group child elements within ag-grid

Is there a way to disable row selection in ag-grid specifically for the rows used to group the grid? For example, clicking on rows labeled with "United States" and "2008" should not trigger selection. Only rows like the one highlighted in blue should be se ...

Decoding Dynamic JSON Data into a Map Using Angular

When working with Angular's http client to fetch data from an API, I create DTOs using typescript interfaces. One of the endpoints returns a JSON object that contains dynamic keys which I want to map into a Map. After trying out different approaches, ...

Steps for deactivating SSR on specific pages in Nuxt3

I'm currently working on a project using Nuxt 3. One part of the application can only be accessed when the user is logged in. I'm trying to figure out how to turn off SSR for these specific routes, but still keep it enabled for the public routes. ...

The error message stating that property 'catch' does not exist on type 'Observable<IEmployee[]>' cannot be fixed by simply adding the import 'rxjs/add/operator/catch'

When I hover over .catch(this.errorHandler), an error message is displayed Property 'catch' does not exist on type 'Observable'.ts(2339) I am unable to import the catch function into Angular Typescript. Upon hovering over .catch(th ...

Verify if the array entries match

Within my select element, I populate options based on an array of values. For example: [{ name: 'A', type: 'a', }, { name: 'B', type: 'b', }, { name: 'B', type: 'b', }, { name: &apos ...

Utilizing React Native Camera Kit allows for the seamless and continuous scanning of QR codes, offering multiple callbacks when a code is

Attempting to integrate a QR code scanner into my project using react native. Utilizing the plugin react-native-camera-kit, which supports both QR and Bar code scanning. However, I am facing an issue where the scanner continuously scans the code and trig ...

Exclude a file in Typescript, regardless of its import status

When attempting to exclude a *.ts file from compilation by adding it to the "exclude" property in tsconfig.json, I am facing an issue. If I import that excluded file somewhere in the code, TypeScript ignores the exclusion and compiles it anyway. How can I ...

How to achieve dynamic class instantiation through constructor injection in Angular 8?

Despite my efforts to find a solution, my understanding of Dependency Injection in services is still limited, making it challenging to get this thing working. I'm left wondering if there's any way to make it work at all. My current setup involve ...

Steps to develop a collaborative NPM package

I am currently in the process of developing an NPM package using Typescript that contains solely my type interfaces. At the moment, my project has the following folder structure: project │ index.ts │ └───types │ restaurant.ts │ ...

Why am I encountering an issue while trying to access req.user.id?

Having set up passport authentication on my express, node project, I encountered an error when trying to access req.user. The error message displayed is Property 'id' does not exist on type 'User'.ts(2339). Below is the relevant code sn ...

Troubleshooting TypeScript issues in an Angular 4 tutorial demo

I recently started working on the Angular tutorial provided on the official website. However, I have encountered an issue that I am struggling to resolve. After using Angular CLI to create the project, I came across the following code in app.component.ts: ...

Unable to allocate submit event category

This is a question about code and an error message. The code snippet is shown below: const handleSubmit = (e: React.FormEventHandler<HTMLFormElement>) => { // e.preventDefault() } <form onSubmit={handleSubmit}></form> Below is ...

Guide on how to add a generic return type to a function in typescript

Is there a way to annotate a function that returns a factory in TypeScript to ensure it contains correct type definitions? Consider the following code: class item<T> { constructor(a: T) { this.a = a; } a: T } function generate(c) { ret ...

The error message "Property 'DecalGeometry' is not found in the type 'typeof "..node_modules/@types/three/index"'."

Within my Angular6 application, I am utilizing 'three.js' and 'three-decal-geometry'. Here is a snippet of the necessary imports: import * as THREE from 'three'; import * as OBJLoader from 'three-obj-loader'; import ...

Encountered an error while attempting to update an object: Unable to read property 'push' of undefined

Encountering an issue while attempting to update an object with additional information, receiving an error message stating 'property \'push\' of undefined'. /*Below is the object model in question:*/ export class Students { ...

Leveraging ngIf and ngFor within choice

Is there a way to combine ngIf and ngFor in a single line of code? Here is the code snippet I am currently using: <option *ngIf="tmpLanguage.id!=languages.id" *ngFor="let tmpLanguage of languages" [ngValue]="tmpLanguage.id"> {{tmpLang ...

What are the best ways to help TypeScript comprehend type checking effectively?

My TypeScript function dynamically retrieves a value of an object's property. The property can be either a number or a Color. If it's a number, the function returns the property value. Otherwise, it returns an array created from the Color propert ...

What is the best way to utilize a variable from a function when using ngClass in Angular?

Currently, using Angular 4, I'm attempting to utilize ngClass by comparing a variable called sender which is created within a function with an object from an array known as item.sender. Below is the snippet of HTML code: <ion-card *ngFor="let ite ...

"Utilizing provideMockStore in NgRx 8 for setting the state of a specific State Slice

I have been working on testing a smart component for my NgRx implementation, and the test setup looks like this: describe( 'Component', () => { let store: MockStore<State>; beforeEach( async( () => { TestBed.configureTesting ...