What causes the TS Generic Type in the given code to execute twice?

The contrast among the outcomes of each example unveils how the 'Generic Type' functions and what distinguishes using 'extends' independently?

type NameOrId<T> = T extends number ? 'add' : 'plus';
type foo = string | number;

type x = NameOrId<foo>
// x is 'add' | 'plus'

type bar = foo extends number ? 'add' : 'plus'
// bar is 'plus'

type zoo = foo extends number | string ? 'add' : 'plus'
// zoo is 'add'

Answer №1

The concept is detailed in the TypeScript documentation under Conditional Types:

When conditional types interact with a generic type and are presented with a union type, they exhibit distributive behavior.

The documentation also provides insights on how to prevent this distribution:

Typically, distributing behavior is expected. To circumvent it, you can encapsulate each side of the extends keyword in square brackets.

As illustrated:

// By enclosing T in square brackets, you avoid the distribution on the union type's members
type NameOrId<T> = [T] extends number ? 'add' : 'plus';

type y = NameOrId<foo>;
// The output for y is 'plus'

You can experiment with it online.

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

Unable to install local dependency using npm

After successfully using npm install react-financial-charts, I decided to include the package locally for specific reasons. I checked out the master branch of react-financial-charts from Github, resulting in two folders: C:\Users\user\projec ...

typescript: textual depiction of a generic type T

I have a requirement to develop a method that is capable of handling generic data types, and I need to incorporate the type information into the method Our API requires passing the entity name as a parameter: http://server/api/fetch/Entity/123 It's ...

Issue with Typescript npm script including compilation and nodemon issue

After exploring various SO links, I tried to find a way to simultaneously run both tsc -w and nodemon app.js using a single command. The link I referred to is: How do I execute typescript watch and running server at the same time? Working on a node.js pr ...

Encountering a Typescript error while attempting to extract state from a History object containing an enum property

My enum structure is as follows: enum values { first, second, } Within my component, I handle the history object like this: const { push, location: { state = {} } } = useHistory(); Additionally, in the same component within a useEffect hook, I have ...

Regular pattern with Kubernetes cluster endpoint utilizing either IP address or fully qualified domain name

In my Angular/typescript project, I am working on building a regex for a cluster endpoint that includes an IP address or hostname (FQDN) in a URL format. For instance: Example 1 - 10.210.163.246/k8s/clusters/c-m-vftt4j5q Example 2 - fg380g9-32-vip3-ocs.s ...

I'm curious about why the value of my variable in service.ts keeps changing whenever the page is refreshed?

Below is my Angular service.ts file code. It is used to store the login status. import { Injectable } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; @Injectable({ providedIn: 'root' }) e ...

Any ideas on how to fix the issue of 'type' property being absent in 'AsyncThunkAction' with Redux Toolkit while working with TypeScript?

While working with Redux Toolkit and the thunk/slice below, I decided to handle errors locally instead of setting them in state. To achieve this, I followed the example provided here. Although I could have set an error in the state, I wanted to explore wh ...

Utilizing TypeScript in an AngularJS (1.x) project alongside Webpack: A Step-By-Step Guide

Currently, I am working through the official guide on transitioning from AngularJS (1.x) to Angular (2+). I have successfully divided my application into Components and integrated ES6 with Webpack as the module loader. However, I now find myself unsure of ...

JSDoc for capturing default values in a dictionary

When working with TypeScript, I have the ability to document a dictionary or map that includes specific entries, but still retains the functionality of a dictionary/map (you can add or remove entries). An example of defining such a structure in TypeScript ...

What could be causing this discriminated union to act differently than anticipated?

Desired Outcome When the href prop is present, TypeScript should recognize that the remaining props are suitable for either a Link or Button element. However, I am encountering an error indicating type conflicts with the button element. Type '{ chil ...

Angular template error: Potential is present but not defined

Encountering an issue with my Angular application's template file (dashboard.component.html). The error message reads "Object is possibly 'undefined'." Here's the portion of the template that seems to be causing the problem: <div> ...

Managing Visual Studio Code Extension Intellisense: A Guide

I am looking to create an extension I recommend using "CompletionList" for users. Users can trigger completion by running "editor.action.triggerSuggest" The process of my extensions is as follows: Users input text If they press the "completion command," ...

The primary text is getting truncated when an ion-note is placed inside an ion-list

I'm currently working with Ionic 3 and attempting to create a list of events where the event name appears on the left and the event note (start time) appears on the right using an ion-note. Below is the code snippet: <ion-list *ngIf="events.len ...

Enhance the array by updating objects within it using the spread operator

I'm looking to modify the name of the second object in a javascript/typescript array. Here's my array: let array = [{id:1,name:'One'}, {id:2, name:'Two'}, {id:3, name: 'Three'}] Is there a way to update the name of ...

Building a custom user authentication system using Angular, Firebase, and Google authentication

Recently, I came across this video (in code), and implemented my Auth Service based on the example provided. However, my User Interface structure is slightly different: interface User { uid: string; email: string; photoURL: string; displayName: st ...

Best practice for refreshing React UseState

Is there a more efficient way to rerender a component without using a resource-intensive script? I currently use a useState() to trigger the rerender, but it's not ideal. My current approach: const restartClick = (): void => { setDivClass(&q ...

Automatically encapsulate Typescript definition files within modules

There seems to be a missing tsconfig option in my setup. Here's what I'm trying to do: I'm developing an npm module, such as: export class HelloWorld { constructor(public greeting: string){} } with the following tsconfig settings: { ...

After performing the `ng build --prod` command in Angular 4, deep linking functionality may not

I have a requirement to display different screens in my Angular application based on the URL pasted by the user in the browser: http://localhost/screen1 (should show screen1) http://localhost/screen2 (should show screen2) To achieve this, I have set up ...

Discover the compatible version of TypeScript for Angular

Is there a resource available that provides a table documenting the correspondence between TypeScript versions and Angular versions? ...

Automatic type inference for TypeScript getters

It appears that Typescript infers field types based solely on the private variable of a field, rather than taking into account the getter's return type union (1) or inferring from the getter itself (2): test('field type inference', () =& ...