Can we deduce the value of a Record datatype in TypeScript?

Is it possible to have TypeScript infer the type of statusColor as yellow instead of Color?

type Status = 'Invalid' | 'Progress' | 'Complete' | 'Error';

type Color=  'yellow' | 'red' | 'green' | 'blue';

const STATUS_TO_COLOR: Record<
  Status,
  Color
> = {
  Invalid: 'yellow',
  Progress: 'blue',
  Complete: 'green',
  Error: 'red',
} as const;

const statusColor = STATUS_TO_COLOR["Invalid"];
     //   ^ inferred as Color, can it be infered as "yellow"?

Playground link to the code

I have experimented with different approaches but none seem to work.

Answer №1

The best approach is to follow the second method you attempted

You can evaluate it for <Status, Color> compatibility

const STATUS_TO_COLOR = {
  Pending: 'orange',
  In Progress: 'blue',
  Finished: 'green',
  Issue: 'red',
} fulfills Record<Status, Color>;

(ts4.9+)

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

Using Typescript Type Guard will not modify the variable type if it is set in an indirect manner

TL;DR Differentiation between link1 (Operational) vs link2 (not functional) TypeGuard function validateAllProperties<T>(obj: any, props: (keyof T)[]): obj is T { return props.every((prop) => obj.hasOwnProperty(prop)) } Consider a variable ms ...

How can I access a nested FormArray in Angular?

I have a situation where I am trying to access the second FormArray inside another FormArray. Here is an excerpt from my component: registrationForm = new FormGroup({ registrations: new FormArray([this.patchRegistrationValues()]) }); patchRegistrati ...

What is the best approach for writing asynchronous code within a promise?

Last week, I came across a fascinating YouTube video discussing Broken Promises, introduced by James Snell. You can explore some great examples highlighted in the video on his GitHub repository. According to Snell, it is advised not to wrap purely synch ...

Submitting Selected Rows in Angular Material Table: Implementing a Button Click Event

Although a similar question has been addressed on Stack Overflow regarding how to pass selected row values of a table to a button click event in Material design using Angular 6, I did not find the solutions provided there helpful for my specific case. In ...

Discovering the Object with the Lowest Key Value in Typescript

Within my TypeScript code, I have defined a List as myList: Package[]. The structure of the Package model is outlined below - export class Package { ID: Number; Price: Number; } I am trying to retrieve a Package object with the lowest Price value using ...

Combine two closely related functions into a single function

I'm dealing with two very similar functions: setEndTimesAndStartTimes(pricerules: PriceRule[], type: string) { this.endTimes = []; this.startTimes = []; pricerules.forEach(pricerule => { if (type === 'end') { ...

Verifying the eligibility of a value for a union type

In my app, there is a type called PiiType that enforces strong typing: type PiiType = 'name' | 'address' | 'email'; When receiving potentially sensitive information from the server, we need to verify if it aligns with this d ...

Separate the date format string into tokens

I am currently attempting to create a function that is able to transform a date format string such as %d/%m/%Y %H:%n where the variables are always denoted by a percentage sign followed by one character, into an array of tokens: ["%d", "/", "%m", "/", " ...

Is it possible to utilize one of the parameters passed into a function as a type within the function itself in TypeScript?

Attempting to create a standard code template. How about this: Function processData(someTypeAlias: string, data: string){ Const mapper:someTypeAlias //Implementation details } I gave it a shot but couldn't get it to work. Any suggestions for someth ...

Queries are failing to pass the test requests

I'm facing a challenge in passing the test for a freeCodeCamp project that involves adding from, to, and limit parameters to a GET /api/users/:_id/logs request to fetch part of a user's log. From and to represent dates in yyyy-mm-dd format, while ...

Conceal the generic type property when exporting

In my components setup, a Wrapper manipulates its children (referred to as Components) by injecting a prop into each child using cloneElement. The challenge is that the props of the Component are generic. I don't want one of the props to be included i ...

The error that has occurred is: `TypeError: The object on the right side of the 'instanceof' keyword is

Testing my function that verifies if a variable is an instance of a specific type and performs an action has been successful. I conduct the verification using the following code: myCheckingFunction = () => { if (target instanceof H.map.Marker) { ... ...

Issue with jsPDF: PNG file is either incomplete or corrupted

I'm encountering an issue while attempting to pass Image data to the addImage function. I have tried downgrading the versions of jspdf and html2canvas, as well as experimenting with different ways to import the two libraries, but the problem still per ...

How can I limit the keys in a Typescript object to only certain strings?

Is there a way in Typescript to create an object of type Partial with keys that can only be a combination of 'a', 'b', or 'c'? The object should not have all 3 keys, but it must have at least one. Here's what I've at ...

I need to access the link_id value from this specific actionid and then execute the corresponding function within the Ionic framework

I have a JavaScript code in my TypeScript file. It retrieves the attribute from a span element when it is clicked. I want to store this attribute's value in a TypeScript variable and then call a TypeScript function. Take a look at my ngOnInit method, ...

What is the best way to dynamically include various properties in an object type depending on a generic union?

Consider the following union type: type Union = "a" | "b"; Is there a way to add multiple new keys to an object type with conditions? Adding one key with a condition is straightforward: type Condition<T extends Union> = { [K in ...

Limit the allowable React Component prop type in Typescript

To promote composition within our codebase, we utilize passing components as props. Is there a way to enforce type checking for the components passed as props? For instance, let's consider a commonly used Typography component throughout the codebase, ...

Bring in modules from around the world into your Ionic framework built with Angular

While working with the ionic framework, I have noticed that many of my pages require the same modules. import { Http } from '@angular/http'; import { Storage } from '@ionic/storage'; Therefore, I find myself setting them in the constr ...

What are the best practices for integrating PrimeVue with CustomElements?

Recently, I decided to incorporate PrimeVue and PrimeFlex into my Vue 3 custom Element. To achieve this, I created a Component using the .ce.vue extension for the sfc mode and utilized defineCustomElement along with customElements.define to compile it as a ...

Error is being thrown due to defining a variable after it has already been declared and

Before I use a variable, I encountered the issue of using it before its definition, interface IProps extends WithStyles<typeof STYLES>; const STYLES = () => ({ }) Although it didn't cause any errors, a warning appeared: STYLES used befo ...