Is it possible to automatically deduce a mapped type from function overloads in TypeScript?

Considering the following function overloads:

function f(p: 'a'): 'x';
function f(p: 'b'): 'y';
function f(p: 'c'): 'z';

Is there a way to deduce this mapping from f?

type M = {
  'a': 'x';
  'b': 'y';
  'c': 'z';
}

Answer №1

Discovered a method that, although somewhat convoluted, is capable of handling a limited number of overload scenarios.

interface Test {
  f(p: 'a'): 'x';
  f(p: 'b'): 'y';
  f(p: 'c'): 'z';
};

type MapArgumentToReturn<F> =
    F extends { (a: infer A): infer AR; (b: infer B): infer BR; (c: infer C): infer CR } ? [A, AR]|[B, BR]|[C, CR] :
    F extends { (a: infer A): infer AR; (b: infer B): infer BR } ? [A, AR]|[B, BR] :
    F extends { (a: infer A): infer AR } ? [A, AR] :
    never;

type TupleToObject<T extends [string, any]> = { [key in T[0]]: Extract<T, [key, any]>[1] };

type Result = TupleToObject<MapArgumentToReturn<Test['f']>>;

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

Encountering an error stating "Property of undefined cannot be read" while attempting to call a function

While I can call a function without any issues, when attempting to call it within setInterval to have it run every second, an error arises: "cannot read property of undefined on the service!" constructor(private route: ActivatedRoute,private conversati ...

The implementation of conditional parameter types in TypeScript

I am struggling with a function where the type of the first argument is determined by the second argument's value of true or false According to my logic, if userExists is true, data should be a string and if it's false, data should be a number. ...

How to determine the presence of 'document' in Typecsript and NextJS

Incorporating NextJS means some server-side code rendering, which I can manage. However, I'm facing a challenge when trying to check for set cookies. I attempted: !!document && !!document.cookie as well as document !== undefined && ...

Navigating through the typings directory in Visual Studio 2015

Is it necessary to include the typings folder as part of an asp.net application in Visual Studio 2015 when using typings? I would like to handle the typings folder similar to the bower_components folder - not checking it and not including it in my solutio ...

Playing around with RN Cleansing

Currently, I am referring to the Detox mocking guide specifically with typescript. The issue I am facing is that the app consistently logs console.log from the X.ts file instead of the expected X.e2e.ts file. Here are the versions of dependencies in use: ...

Error: global not declared in the context of web3

I've been attempting to integrate Web3 into my Ionic v4 project for some time now. However, I keep encountering errors when I try to serve the project. Specifically, I receive an error message stating that Reference Error: global is not defined. Cre ...

Implementing Read-Only Properties in Interfaces and/or Classes

I am currently working on a class that acts as a Model and I want to ensure that the data within it is read-only. While this may seem straightforward at first, things get more complicated when dealing with nested data structures. Let me provide an example ...

Verify if the date and time in string format is the exact same as noon

In my data collection, there are multiple objects each containing a specific date and time value: [ {dt: "2019-11-29 12:00:00"}, {dt: "2019-11-29 3:00:00"}, {dt: "2019-11-29 6:00:00"}, {dt: "2019-11-30 12:00:00"}, {dt: "2019-11-30 6:00:00"} ] M ...

Angular 2 - Dragula for ng2

<div *ngFor="let col of columns"> ... <div [dragula]="'tickets-list'" [dragulaModel]="col.tickets" (drop)="onDrop($event, col)"> <ul> <li *ngFor="let ticket of col.tickets"> {{ ticket }} </li ...

Is it feasible to have two interfaces in Typescript that reference each other?

I am facing an issue with two interfaces, UserProfile and Interest. Here is the code for both interfaces: export default interface UserProfile { userProfileId: string, rep: number, pfpUrl: string, bio: string, experience: "beginner" | " ...

Receiving an error stating "module not found" when attempting to retrieve the NextAuth session using EmailProvider in getServerSideProps

Trying to access the NextAuth session from a server-side call within getServerSideProps, using an EmailProvider with NextAuth. Referring to an example in NextAuth's documentation, I'm attempting to retrieve the session from getServerSideProps. T ...

How can I effectively integrate TypeScript with Jest to mock ES6 class static properties?

For the purpose of simulating payment failures in my Jest tests, I have developed a mock file for mangopay2-nodejs-sdk: // __mocks__/mangopay2-nodejs-sdk.ts import BaseMangoPay from 'mangopay2-nodejs-sdk'; export default class MangoPay extends B ...

Unable to locate a custom definition for TypeScript v3

When I am running my webpack dev server, Typescript is generating this error: ERROR in ./src/components/allowcated-resources/AllowcatedResources.tsx Module not found: Error: Can't resolve 'my-scheduler' in 'mypath\allowcated-resou ...

Customized Generic Types in TypeScript based on optional property conditions

In my React/Typescript app, I currently have the following code snippet - export type GetPricingParams = { search_id: number, promo_code?: string, }; export type GetPricingData = { amount: number, currency: string, search_id: number, ...

Tips on transferring key values when inputText changes in ReactJs using TypeScript

I have implemented a switch case for comparing object keys with strings in the following code snippet: import { TextField, Button } from "@material-ui/core"; import React, { Component, ReactNode } from "react"; import classes from "./Contact.module.scss" ...

Probability of an event occurring when represented as whole numbers in percentage form

Currently, I'm developing a unique job system within a Discord bot that allows users to mine various types of ores. The probability of receiving specific ores is based on the user's mining skill level, which is stored in a database and can vary a ...

Is it possible to verify .0 with regular expressions?

In my project, I have a field that requires whole numbers only. To validate this, I used a regex validation /^\d{1,3}$/ which successfully validates whole number entry and rejects decimal points starting from .1. However, I encountered an issue where ...

Passing public field names with typed expressions in TypeScript

I've been exploring ways to pass an array of property names (or field names) for a specific object without resorting to using what are often referred to as "magic strings" - as they can easily lead to typos! I'm essentially searching for somethin ...

Transforming an array of flat data into a hierarchical tree structure

I'm facing a challenge with my script. I have an Array of FlatObj and some rules, and I need to create a converter function that transforms them into TreeObj. The Rules are: If an object has a higher depth, it should be a child of an object with a l ...

Enhancing Nativescript with the latest JavaScript updates

The NativeScript manual states that TypeScript (.ts) files are automatically compiled to JavaScript during project build. However, in my Angular + TypeScript mobile application, I have observed that the compilation of .ts files to .js files does not alw ...