How can I dynamically utilize the type of a property in an object in Typescript?

Consider the following code snippet:

type Action = {
    type: string;
    data: /* need help here */;
};

// data is a string here
const action1: Action = {
    type: 'foo',
    data: 'bar'
};

// data is an object here
const action2: Action = {
    type: 'complex',
    data: {
        first: 'John',
        last: 'Doe'
    }
};

// data is not defined here
const action3: Action = {
    type: 'undef'
};

// and so on, the point is data can be anything 

I am looking for a way in Typescript to set the type of data dynamically based on the assigned value, without using any to retain editor's intellisense support. Is this possible in Typescript?

Answer №1

This code snippet demonstrates how to use a generic type in TypeScript to allow for flexibility with the data parameter:

type Action<T> = {
    type: string;
    data?: T;
};

Instead of duplicating the type when defining variables, we can utilize a function to automatically infer the generic type:

function action<T = undefined>(a: Action<T>): Action<T> {
    return a;
}

Check out the Playground to see this in action.

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

Unexpected results observed in enumerators within typescript

Could someone clarify the results that I am seeing from the code below? enum days { sun = 1, mon = 0, tues }; console.log(days[1]); // outputs tues // should output -- mon console.log(days[0]); // outputs mon // should output -- sun Furthermore, how ...

Angular 6 - Build a dynamic single page housing various applications within

I am faced with the task of developing multiple applications using Angular 6. Each application will have its own set of components, services, and more. However, there is also a need for shared services, components, directives, and other elements that will ...

Library for Typescript on npm

My project involves a collection of base classes in TypeScript. Within a web application built with React and written in TypeScript, I am looking to integrate a library called 'Plain Old TypeScript objects', which defines all the data types. Let& ...

Can you help me troubleshoot an issue I am facing with the expand table in Angular 9 and JS? I am getting an

Here you can find the code demonstration and behavior: No extensive explanation is necessary. Check out the StackBlitz demo by clicking on the first row to view its details. Then, click on the second row to see how the details from the first row are repl ...

Using vue-class-component: A guide on creating and setting up reactive data

I am currently working with Vue.js using TypeScript and vue-class-component. My goal is to create a custom component with reactive data. Below is the code I have so far: <template> <div> <input v-model="data.name" placeholder=" ...

Struggling with using Redux with tassign in Angular (typescript) to combine state.array and action.array. However, encountering an issue where state.array.join is not a function

Redux function to combine all videos: function combineAllVideos(state, action) { return tassign(state, { allVideos: state.allVideos.concat([action.data]) }); } Declaration + State for all videos array: allVideos: Array<Object>; OR allVid ...

Exploring the Power of SectionList in Typescript

How should SectionList be properly typed? I am encountering an issue where this code works (taken from the official documentation example): <SectionList renderItem={({item, index}) => <Text key={index}>{item}</Text>} renderSectionHea ...

What is the most effective way to display individual items from an NgFor one by one using Angular?

Currently, I am working on an ngfor loop with three items and my goal is to present them in a step-by-step format, similar to how questions are displayed in a form. For example, I want the second question to only show up once the first step has been comple ...

Typescript error: Cannot access property "status" on type "never".ts(2339)

Currently, I have a method that utilizes nextjs/auth to sign in with credentials from a form. However, I am encountering a type checking error Object is possibly 'undefined'.ts(2532) const doStuff = async (values: any) => { const result: S ...

Enhancing the selection of options in Angular 2 using object values

When I retrieve a list of object values from an API, each object contains a property to identify the selected item. I am successfully binding the items list to the view. Here is the JSON data: https://i.sstatic.net/itmfh.png Below is my code snippet: & ...

Correct TypeScript function placement outside of return statement

I'm currently working on a NodeJS and Typescript project that already exists, and I've come across a function that seems a bit confusing to me. I don't think it's well-written either. This particular function is responsible for compari ...

Update the router URL without switching pages, yet still record it in the browser history

One of the features on my search page allows users to perform searches and view results. Initially, I faced a challenge in updating the router URL without navigating, but I managed to overcome this by utilizing the "Location" feature. In my ngOnInit meth ...

Using Typescript with Styled-Components and Styled-System: Unable to find a matching overload for this function call

Encountering the infamous "No overload matches this call" error when using a combination of Typescript, Styled-Components, and Styled-System. I've come across solutions that suggest passing a generic type/interface to the styled component, like the o ...

Troubleshooting Issue: Angular 6 - Authentication token interceptor not including headers

After experimenting with various approaches using Angular 6 for the past couple of days, I recently tried implementing a solution mentioned in this post: . Despite my efforts, the header in the requests still remains unset. import {Inject, Injectable} fro ...

The code is throwing an error: Unable to access the 'grower' property as it is undefined

I'm facing an issue with a button that triggers the function 'SaveNewOpportunity' in my component file. When I click the button, I encounter the following error: ERROR TypeError: Cannot read property 'grower' of undefined Here is ...

Encountering an issue with the ts.createNodeArray function during the compilation of a NestJS project

Our NestJS project recently underwent a migration from node v14 to node v19.7, necessitating an update of all packages in the package.json file. However, this update has led to a strange error that we are currently struggling to identify and resolve. Her ...

Type aliases using generics may demonstrate varying behaviors from type aliases without generics

Here is a code snippet to consider: type TestTuple = [ { test: "foo" }, { test: "bar"; other: 1; } ]; type Foo<Prop extends string> = TestTuple extends Record<Prop, string>[] ? true : fal ...

Integrating jquery into an angular project

I am facing an issue setting up jquery in an angular 6 project. When I try to import it in the ts file, I encounter the following error: Error: This module can only be referenced with ECMAScript imports/exports by turning on the 'allowSyntheticDe ...

Can Angular 4 experience race conditions?

Here is a snippet of my Angular 4 Service code: @Injectable() export class MyService { private myArray: string[] = []; constructor() { } private calculate(result): void { myArray.length = 0; // Perform calculations and add results to myAr ...

Accessing specific elements in Typescript 3.5 using indexes

I am looking to create a type-safe getter function that has the ability to return modified values while still being sound. class Foo { a: number; b: boolean; } function getProp<K extends keyof Foo>(o: Foo, p: K): Foo[K] { switch (p) { ca ...