Home > Software design >  Working with functions that return multiple types
Working with functions that return multiple types

Time:01-27

I'm having a hard time working with functions that return multiple types:

Here's an example

function returnM(x: Number): Number | { a: Number; b: Number } | undefined {
  if (x < 10) {
    return undefined;
  } else {
    return x;
  }
}
let result: any = returnM(3);

switch (result) {
  case undefined: {
    // do NNN
    break;
  }
  // case Number do XXX
  // case Object {a: Number, b: Number } do YYY
}

console.log(result);

I'm trying to find an elegant way to inspect the specific type that's returned and then act accordingly.

Even having to set "result: any " feels like a bit of a hack.

What's the best way to handle this?

CodePudding user response:

You should use number instead of Number.

function returnM(x: number): number | { a: number; b: number } | undefined {
  if (x < 10) {
    return undefined;
  } else {
    return x;
  }
}

let result = returnM(3);

switch (typeof result) {
  case "undefined": {
    result // type: undefined
    break;
  }
  case "number": {
    result // type: number
    break;
  }
  case "object": {
    result // type: { a: number; b: number }
    break;
  }
}

CodePudding user response:

If your return type looks exactly like your demo code, then switch(typeof result) is possible:

function returnM(x: Number): Number | { a: Number; b: Number } | undefined {
  if (x < 10) {
    return undefined;
  } else if(x < 20) {
    return {"a":10,"b":Number(x)-10};
  } else {
    return x;
  }
}
let result: any = returnM(Math.random()*40);

switch (typeof result) {
  case "undefined":
    console.log("undefined is returned");
    break;
  case "number":
    console.log("A number is returned");
    break;
  case "object":
    console.log("An object is returned");
}

console.log(result);

online playground

  •  Tags:  
  • Related