jfu
jfu

Reputation: 1700

Destructuring of union types in typescript

Is there a way (similar to pattern matching from functional languages) to destructure a union type in TypeScript, i.e. some construct like:

var a: Foo | Bar = ...;

a match {
   case f: Foo => //it's a Foo!
   case b: Bar => //it's a Bar!
}

If there is no such construct - are there any technical difficulties in creating such construct?

Upvotes: 9

Views: 3783

Answers (1)

Ryan Cavanaugh
Ryan Cavanaugh

Reputation: 221212

TypeScript understands Type Guards as a way of decomposing union types. There are several ways you can use this.

If Foo or Bar is a class, you can use instanceof:

if (a instanceof Foo) { a.doFooThing(); }

If they're interfaces, you can write a user-defined type guard:

function isFoo(f: any): f is Foo {
    // return true or false, depending....
}
if (isFoo(a)) {
   a.doFooThing();
} else {
   a.doBarThing();
}

You can also use typeof a === 'string' to test for primitive types in a union (string, number, or boolean)

Upvotes: 13

Related Questions