Typescript property does not exist on union type

Solution 1:

You have to narrow down the type. You can do so by using the in operator.

const getText = (obj: Obj1 | Obj2): string => {
  if ("message" in obj) {
    return obj.message
  }

  return obj.text
}

Solution 2:

You can cast the object to either Obj1 or Obj2:

type Obj1 = {
  message: string
}

type Obj2 = {
  text: string
}

const getText = (obj: Obj1 | Obj2): string => {
  if ((obj as Obj1).message) {
    return (obj as Obj1).message
  }

  return (obj as Obj2).text
}

Solution 3:

The real answer to this problem according to what the question owner asked is this

But there might be a time you are using your defined type with primitive type in this way the above solution is not going to work as the problem I faced here is the situation

type Obj1 = {
  message: string
}

const getText = (obj: Obj1 |string): string => {
  if (obj.message) {
    return obj.message
  }

  return obj.text
}

so this scenario the solution stated above would not be perfect for you, so you might need to use typeof ✌️

const getText = (obj: Obj1 | string): string => {
  if (typeof obj !== 'string') {
    return obj.message
  }

  return obj.text
}