What is the purpose of including a vertical bar (|) before a union type literal in TypeScript?

A piece of TypeScript code I recently wrote goes as follows:

type FeatureFlagConfig = { enabled: false }
  | {
      enabled: true;
      key: string;
    };

Interestingly, when I saved the code in VSCode, it automatically reformatted to:

type FeatureFlagConfig =
  | { enabled: false }
  | {
      enabled: true;
      key: string;
    };

What catches my attention is the use of | a | b syntax instead of a | b. This addition of the initial | (vertical bar) might seem odd, but it seems to be the preferred style by linters. Is this purely for formatting purposes to have each union member on its own line? And is this format considered valid TypeScript syntax? It's not explicitly mentioned in the TypeScript specification here: https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#386-union-type-literals

Answer №1

Even though it is not explicitly mentioned in the specification, Typescript does indeed offer support for this: https://github.com/microsoft/TypeScript/issues/12071

An interesting feature in Typescript allows for using a leading | (or &) character to separate options in a type union/intersection, providing more flexibility in code formatting. This syntax is common in other languages like Flow, F# and was introduced in "TypeScript 2.1.3, Community on Nov 28, 2016".

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

Compiling with tsc --build compared to tsc --project

I'm currently working on converting a subproject to TypeScript within my monorepo. Within my npm scripts, I initially had: "build-proj1":"tsc --build ./proj1/tsconfig.json" Although it did work, I noticed that the process was unus ...

Encountering an error in Angular 10/11 when integrating ngx-sharebuttons: "The import of 'ɵɵFactoryTarget' (alias 'i0') from '@angular/core' was not found."

As I work on enhancing my angular app, I am looking to incorporate social media share buttons. I came across ngx-sharebuttons, which seems to offer the functionality I desire. However, I am facing issues while trying to build my angular application using ...

Steps to customize the color scheme in your Angular application without relying on external libraries

Is there a way to dynamically change the color scheme of an Angular app by clicking a button, without relying on any additional UI libraries? Here's what I'm trying to achieve - I have two files, dark.scss and light.scss, each containing variabl ...

Reusing a lazy-loaded module across multiple applications

Currently, I am working on an enterprise Angular 2 application with numerous lazy loaded modules. A new project came up where I needed to reuse a module that was previously created for the main app. After researching online, the only solution I found was ...

Reactive form loses preloaded data due to ExpressionChangedAfterItHasBeenCheckedError when modal is dismissed

Within my project, I have a sidenav that contains various links. One of these links directs to a component that presents some input data. Below is the TypeScript code: @Input() data: MyData; myModal: BsModalRef; editForm: FormGroup; ngOnInit(){ this. ...

Unable to assign values using Promises in an Angular component

While working on a Component HTML file, I encountered an issue with exposing a variable. The variable was supposed to retrieve a value from the response using cl.getMonitors. Strangely, despite seeing console.dir(res) in the console, the value of the var ...

Arranging an array of objects in typescript with elements implicitly having an undefined type

Currently, I am facing a challenge where I need to sort an array of objects within a function. The catch is that the function receives the key as a parameter, making it unknown: export interface ProductsList { id: boolean nome: string qtde: number ...

Tips for effectively utilizing a Query or QueryTask with local graphics (GraphicsLayer)

Working on developing an ESRI map prototype using Angular4, I have successfully utilized the Draw tool to initiate a Query on a FeatureLayer to draw various graphics such as ConvexHull and Buffer. The primary goal was to create a clear Buffer graphic over ...

What is the best way to dynamically insert content into a PDF using pdfmake?

In my quest to dynamically generate PDFs using pdfmake, I've encountered an issue with creating dynamic rows based on data. To illustrate, here is a simplified version of the code: getDocumentDefinition(img: string, data: DataResponse, user: UserResp ...

The usage of @Inject('Window') in Angular/Jasmine leads to test failures, but removing it results in code failures

Currently, I am encountering a dilemma related to using Angular's @Inject('Window') within a web API service. This particular issue arises when the Window injection is utilized in the service constructor, leading to test spec failures in the ...

Using the useRef hook to target a particular input element for focus among a group of multiple inputs

I'm currently working with React and facing an issue where the child components lose focus on input fields every time they are re-rendered within the parent component. I update some state when the input is changed, but the focus is lost in the process ...

Ways to send information from a child component to its parent component when a button is clicked in the

Being new to Angular, I am faced with a challenge of organizing a large form into smaller modular components. I have created multiple child components and integrated their selectors in the main parent component. In the parent component, there is a 'sa ...

Managing optgroup in select dropdown using Angular 4

Is there a way to retrieve the optgroup label value within an onchange function on a select box in Angular 4? In my form, I have a select box with multiple dates as option groups and time slots in 24-hour format for booking (e.g. 1000 for 10AM, 1200 for 1 ...

Enabling Javascript compilation while overlooking typescript errors

Currently, I am working in VS Code with create-react-app using TypeScript. Whenever there are type errors, they show up in the browser and prevent compilation by TypeScript. I am looking for a way to only see these errors in the Google console and termin ...

Please enter a number to exclusively accept whole numbers with the use of the addEventListener method

My goal is to create an HTML input field that only allows entry of numbers between 1 and 999, with a maximum length of 3 characters. However, I am facing an issue with decimal numbers being accepted in the input. How can I restrict the input to only accept ...

The forkJoin method fails to execute the log lines

I've come up with a solution. private retrieveData() { console.log('Start'); const sub1 = this.http['url1'].get(); const sub2 = this.http['url2'].get(); const sub3 = this.http['url3'].get(); ...

TypeScript anonymous class-type Higher Order Component (HOC)

Struggling with creating a generic Higher Order Component (HOC) due to type issues. Let's start with a simple example: class Abc extends React.Component<{}> { hello() { } render() { return <View /> } } Referenc ...

Leverage generics to assign a static type to the key of a record in a way that refers back to

I am working on developing a finite state machine companion for my chatbot automation library. The aim is to guide users towards different conversation phases while interacting with the bot. The plan is for the users of the library to supply a "state mach ...

Guide on Implementing jQuery Plugin with Vue, Webpack, and Typescript

I am currently exploring the integration of the jQuery Plugin Chosen into my vue.js/Webpack project with TypeScript. After some research, I discovered that it is recommended to encapsulate the plugin within a custom Vue component. To kick things off, I m ...

Hiding components in Angular 4/5 through routing decisions

Just getting started with routing in Angular 4/5, I am currently following the tutorial provided on the official Angular website. I have an Angular application and I want to create two separate pages. Currently, the main page is located at localhost:8870/d ...