Is there a way to create a typesafe Map in TypeScript with a key and value both being of the same generic type X?

The desired outcome should be as follows:

const newObj: ??? = {
  [Fruit<Apple>]: Taste<Apple>,
  [Fruit<Banana>]: Taste<Banana>,
}

const selectedKey: Fruit<Apple> = ...;

newObj[selectedKey] // should only return Taste<Apple>

I am aware that I could potentially use

Record<Fruit<T>, Taste<T>>
but this would still permit me to assign Taste<Apple> to Fruit<Banana>;

Answer №1

To achieve this, you can utilize a map structure that indicates the relationship between different Fruit types and their corresponding Taste. Here's an example:

type FruitTasteMap = {
    apple: 'delicious',
    banana: 'okay'
}

Your object would then be defined as:

type F = {
    [k in keyof FruitTasteMap]: FruitTasteMap[k]
} 

This setup gives you the desired outcome:

const ok: F = { // OK
  apple: 'delicious',
  banana: 'okay'
}

const wrong: F = {
  apple: 'delicious',
  banana: 'love it!' // Type '"love it!"' is not compatible with type '"okay"'
}

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

The onChange event for React input does not trigger when the value remains the same

Script: function SingleInput(props: {value: string; onChanged: (value: string) => void}) { const handleChange = useCallback( (e: React.ChangeEvent<HTMLInputElement>) => { const newValue = e.target.value; cons ...

Can we combine two arrays of objects based on their unique identifiers?

I am working with two arrays of objects: firstAry = [{ "status": "Creating", "datacenter-id": "1test", "datacenter-name": "1name" }, { "status": "Creating", ...

Leverage the child interface as a property interface containing a generic interface

I'm facing an issue while trying to incorporate typings in React. The concept is centered around having an enum (EBreakpoint) that correlates with each device we support. A proxy wrapper component accepts each device as a prop, and then processes the ...

Injecting services and retrieving data in Angular applications

As a newcomer to Angular, I am trying to ensure that I am following best practices in my project. Here is the scenario: Employee service: responsible for all backend calls (getEmployees, getEmployee(id), saveEmployee(employee)) Employees components: displ ...

Implement dynamic validation in Angular 4 based on specific conditions

I am looking to implement Angular 4 validation dynamically based on specific conditions within a Reactive form. Here is the scenario: There is a radio button with options: A: yes B: no If the user selects "yes", a textbox (formControlName="your_name") wil ...

Typescript does not support index signatures with bracket property accessor when importing using the `import * as`

Currently learning typescript and in the process of converting a large program from javascript. While fixing errors and adding types, I'm stuck on this one particular issue. Here's myModule.ts: export const foo = { ... } export const bar = { .. ...

Show refined information upon form submission or click

I am facing a challenge with implementing filtering functionality in an input box within a form in Angular 12. Despite my efforts, I have been unable to get the pipe working correctly in the component and consequently in the view. HTML ...

Different types of TypeScript interface keys being derived from an enum

How can I efficiently implement a list of properties to be used as keys in interfaces with different types? I want to restrict the use of properties that do not exist in an enum. export enum SomeProperties { prop1, prop2, prop3 }; export interface ...

An angular component that is functioning properly when connected to a live server, however, it is experiencing issues when trying to run `

I tried integrating versitka into my Angular component by placing the version HTML file and all necessary assets in the appropriate directories. However, when I run ng serve, only the HTML file seems to be working, while the CSS and images fail to load. I ...

Error encountered when using object literals in React with Typescript

I am facing an issue with a component that is supposed to render a row of data with a delete button for each row. When the delete button is clicked, it should update the state by filtering out the clicked row. However, I am encountering an error despite ge ...

Angular 6 combined with Firebase is experiencing difficulties with routing after a successful login

After spending hours trying to fix my issue, I still can't figure it out. I've searched through related threads on SO, but haven't found a solution yet. Issue After successfully signing up, the email verification flag is set to true. Howev ...

Can the inclusion of additional parameters compromise the type safety in TypeScript?

For demonstration purposes, let's consider this example: (playground) type F0 = (x?: string) => void type F1 = () => void type F2 = (x: number) => void const f0: F0 = (x) => console.log(x, typeof(x)) const f1: F1 = f0 const f2: F2 = f1 f ...

What is the best way to show specific links in the navigation bar only when the user is signed in using Angular?

I'm attempting to customize the navigation bar to display "Sign In" and "Sign Up" buttons only when the user is not signed in, and show the message and profile navigation items when the user is signed in. Below is the provided code snippet: Token Se ...

Guide on saving a PDF file after receiving a binary response using axios

Is there a way to save a PDF file from a binary response received through an axios get request? When making the request, I include the following headers: const config: AxiosRequestConfig = { headers: { Accept: 'application/pdf', respon ...

Find the distinct values from an array of objects containing varying elements using Typescript

My array contains dynamic elements within objects: [ { "Value1": [ "name", "surname", "age" ], "Value2": [ "name" ...

Error: Unable to initialize i18next as a function

For my current project, I am utilizing TypeScript and i18next for internalization. TypeScript version: 2.1.4 i18next version: 2.3.4 @types/i18next version: 2.3.35 In the specific file: import * as i18next from 'i18next'; i18next.init({ ...

Is it necessary to use Generics in order for a TypeScript `extends` conditional type statement to function properly?

Looking to improve my understanding of the extends keyword in TypeScript and its various uses. I recently discovered two built-in utilities, Extract and Exclude, which utilize both extends and Conditional Typing. /** * Exclude from T those types that are ...

Tips for navigating to a specific item in a react native list?

Is it possible to scroll to a specific element within a list based on another element in the list? For example, if you have a list [a,b,c,d], and each element is a touchableopacity with text a b c d respectively, can you set it up so that clicking on &apos ...

Retrieve the property values of `T` using a string key through the `in

Having trouble accessing a property in an object using a string index, where the interface is defined with in keyof. Consider the following code snippet: interface IFilm { name: string; author: string; } type IExtra<T extends {}> = { [i ...

Eliminate the unnecessary code repetition in my functions using Typescript

I have 2 specific functions that manipulate arrays within an object. Instead of repeating the same code for each array, I am looking for a way to create reusable functions. Currently, my functions look like this: setLists(): void { if (this.product.ord ...