联合体类型上不存在Typescript属性

时间:2019-11-21 12:04:52

标签: typescript

这是我遇到过几次的情况,看起来应该很简单,但是我找不到一个没有将类型设置为任何类型的解决方案

函数将两个不同对象之一作为参数,检查已接收到哪个对象,并返回相应的字段。

这是问题的简化版本,但是问题在于这两个对象只能通过它们的属性(没有重叠)来区分,并且我无法访问任何属性,因为它们不存在在另一种类型上。

type Obj1 = {
  message: string
}

type Obj2 = {
  text: string
}

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

  return obj.text
}

4 个答案:

答案 0 :(得分:3)

您必须缩小类型。您可以使用in运算符来实现。

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

  return obj.text
}

答案 1 :(得分:1)

您可以将对象投射到Obj1Obj2

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
}

答案 2 :(得分:0)

根据问题所有者提出的问题,此问题的真正答案是this

但有时您可能会以这种方式将 your defined typeprimitive type 一起使用,上述解决方案不会像我遇到的问题那样奏效 这是情况

type Obj1 = {
  message: string
}

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

  return obj.text
}

所以在这种情况下,上述解决方案对您来说并不完美,因此您可能需要使用 typeof ✌️

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

  return obj.text
}

答案 3 :(得分:-1)

我推荐typescript-is

import { is } from 'typescript-is';

...

const getText = (obj: Obj1 | Obj2): string => {
  if (is<Obj1>(obj)) {
    return obj1.message;
  }

  return obj2.text;
};