Leveraging TypeScript Generics for Type Reusability

Is there a way to extend the generic types defined in the type T to a function without duplicating code? Can we reuse generics between types and functions?

type T<FormType extends 'edit' | 'create' = 'create', RecordType extends Record = Record> = {
   type: FormType,
   record: RecordType
}

const func = <FormType extends 'edit' | 'create' = 'create', RecordType extends Record = Record>(props: T<FormType, RecordType>) => ...

How can we expand the

<FormType extends 'edit' | 'create' = 'create', RecordType extends Record = Record>
from type generics to function generics without having to duplicate the code?

Answer №1

One approach that can be useful is simplifying it to a single Base type:

type CommonType = {
  form: 'edit' | 'create'
  dataType: Data
}

type Base = {
  form: 'edit';
  dataType: Data
}

type CustomType<B extends CommonType = Base> = {
   kind: FormKind,
   data: DataType
}

const customFunction = <B extends CommonType = Base>(props: CustomType<B['form'], B['data']>) => ...

This method significantly reduces verbosity, especially with an increasing number of generics.

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

When working with Visual Studio and a shared TypeScript library, you may encounter the error message TS6059 stating that the file is not under the 'rootDir'. The 'rootDir' is expected to contain all source files

In our current setup with Visual Studio 2017, we are working on two separate web projects that need to share some React components built with TypeScript. In addition, there are common JavaScript and CSS files that need to be shared. To achieve this, we hav ...

Troubleshooting: Ionic Cordova's Post Functionality Fails to

I am a newcomer to Hybrid application development, currently utilizing Ionic Cordova for my project. My aim is to implement a POST method within the application. var url = "http://XXXXXXXXXXXXX.com/XXXX"; var headers = new Headers(); headers.append("Acce ...

What steps are necessary to obtain a specific set of data and organize it accordingly?

I'm currently working on structuring my input data, but I'm facing some challenges in achieving the desired outcome. The input data is dynamic and will be coming from a database. Let's consider the JSX code snippet provided below. My aim is ...

There seems to be an issue with the OpenAPI generator for Angular as it is not generating the multipart form data endpoint correctly. By default

Here is the endpoint that needs to be addressed: @PostMapping(value = "/file-upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public List<FileReference> handleFileUpload( @RequestPart(value = "file", name = "f ...

What exactly is a more defined type of interface in Typescript?

Dealing with a type in typescript that consists of an object where all properties must be of type number. I am trying to create more concrete interfaces based on this type and pass them as generic parameters to a class that extends my basic type. However, ...

Accessing and manipulating a intricate JSON structure within an Ionic 3 framework to seamlessly connect it to the user

I'm currently developing an app using Ionic 3. Within my project, I have a JSON object structured like this: { "player": { "username": "thelegend", "platform": "xbox", "stats": { "normal": { "shots ...

Is it possible to prevent the Virtual Keyboard from automatically appearing on mobile devices?

Whenever a user enters a number on a page component, the Virtual Keyboard on their Mobile device pops up and shifts the entire page. I am looking for a solution to either disable the on-screen keyboard or ensure that the text box remains visible even when ...

Tips for displaying an Angular 2 HTML page once the REST webservice response is received

When I retrieve a REST web service response, I can easily display it on the screen without any issues. However, the problem arises when the initial value of the web service call result is visible on the page. What steps should I take to render the page onl ...

Angular 17 | Angular Material 17.3.1: Problem encountered with Angular Material form field focus and blur event handling

I attempted to apply (blur) and (focus) effects to my mat-form-field input field, but it seems like they are not working properly on my system. Here is a code snippet that resembles what I am using: html file <form class="example-form"> ...

Creating conditional routing in an Ionic 3 Lazy module with dynamic page navigation

In my lazy loading Ionic 3 app, I have three different pages: "LoginPage," "VideoPage," and "HomePage." On the VideoPage, there is a checkbox that allows users to choose whether to show the video on the next start. The routing flow is as follows: "LoginPa ...

Custom type checker that validates whether all properties of a generic object are not null or undefined

In an attempt to create a user-defined type guard function for a specific use-case, I am faced with a challenge: There are over 100 TypeScript functions, each requiring an options object. These functions utilize only certain properties from the object wh ...

TypeScript - the object may potentially be 'null'

Despite receiving an error message, the program is running perfectly. https://i.sstatic.net/4NQyR.jpg var video = document.querySelector('#camera-stream'), if(!navigator.getMedia){ displayErrorMessage("Your browser doesn't have su ...

Incorporating HTTP status codes into error handling

I have developed an API where I've organized the services separately from the controllers. In my service functions, I've included basic checks to trigger errors when certain conditions are met. Currently, my controller function just returns a 500 ...

Accessing external data in Angular outside of a subscription method for an observable

I am struggling to access data outside of my method using .subscribe This is the Service code that is functioning correctly: getSessionTracker(): Observable<ISessionTracker[]> { return this.http.get(this._url) .map((res: Response) => ...

Issue with Angular 2 Observable testing: Trying to use setInterval in an async zone test is not allowed

I am currently in the process of testing a component that relies on a service for making asynchronous HTTP calls. The service returns an Observable, which is then subscribed to by the component. Snippet from the service code: getRecentMachineTemperatures ...

typescript Object that consists of properties from an array with a defined data type

I have an array consisting of strings. I am trying to transform this array into an object where each string is a property with specific attributes assigned to them. export interface SomeNumbers { name: string; value: number; } const arr = ['apple& ...

Tips for ensuring a method is not invoked more than once with identical arguments

I'm grappling with a challenge in JavaScript (or typescript) - ensuring that developers cannot call a method multiple times with the same argument. For instance: const foo = (name: string) => {} foo("ABC") // ok foo ("123") ...

What is the best method to publish my npm package so that it can be easily accessed through JSDelivr by users?

I've been working on creating an NPM package in TypeScript for educational purposes. I have set up my parcel configuration to export both an ESM build and a CJS build. After publishing it on npm, I have successfully installed and used it in both ESM-m ...

Angular and TypeScript allow for dynamic binding after a click event

My text has annotations marked dynamically with spans. By using the 'addClickEvent' function, I'm able to add a click-event to provide users with more information when they click on the annotations. Although I can retrieve all the informatio ...

Automatic Formatting of Typescript in SublimeText

Utilizing Microsoft's Typescript Sublime Plugin, I am able to format a file using the shortcut ^T ^F as outlined in the plugin's feature list. Is there a method to automatically execute this command when saving a file? Similar to the functionali ...