73

I'm struggling to find the definition of the & operator in TypeScript. I have recently come across the following code:

type IRecord<T> = T & TypedMap<T>;

What does that operator do, and how is it different from the union type |?

Sampson
  • 265,109
  • 74
  • 539
  • 565
ppoliani
  • 4,792
  • 3
  • 34
  • 62

2 Answers2

99

This looks like it's from the Intersection Types portion of the Language Specification. Specifically, the & is an intersection type literal. As for what it does:

Intersection types represent values that simultaneously have multiple types. A value of an intersection type A & B is a value that is both of type A and type B. Intersection types are written using intersection type literals (section 3.8.7).

The spec goes on to offer a helpful snippet to better understand the behavior:

interface A { a: number }  
interface B { b: number }

var ab: A & B = { a: 1, b: 1 };  
var a: A = ab;  // A & B assignable to A  
var b: B = ab;  // A & B assignable to B

Because ab is both of type A and of type B, we can assign it to a and/or b. If ab were only of type B, we could only assign it to b.

The code you shared may be from this comment on GitHub, which mentions Intersection Types.

KyleMit
  • 30,350
  • 66
  • 462
  • 664
Sampson
  • 265,109
  • 74
  • 539
  • 565
  • Looks like the links to the spec are outdated. Can be found here https://www.typescriptlang.org/docs/handbook/unions-and-intersections.html#intersection-types – nick722 Oct 19 '20 at 05:56
7

Worth noting that if you'd prefer to use interfaces over types (although they're largely similar) that you can typically use interface extension instead of type intersection like this:

// base type
interface Shape {
  color: string;
}

// extension
interface Square extends Shape {
  sideLength: number;
}

// intersection
type Square = Shape & {
  sideLength: number;
}

See Also: Difference between extending and intersecting interfaces in TypeScript?

KyleMit
  • 30,350
  • 66
  • 462
  • 664