如何检查对象是否为联合类型之一

时间:2019-10-29 14:52:34

标签: typescript

我有2个接口:TypeATypeB

我的React脚本收到类型为Object的对象TypeA|TypeB

我有一个函数doSomething(attribute:TypeA) 我想将Object传递为这样的属性doSomething(Object), 但是TS说

  

键入'TypeA | TypeB'不能分配给TypeA。     类型“ TypeB”缺少类型“ TypeA”中的以下属性:prop1,prop2,prop3。

也许我只能设置类型为TypeA的新临时变量,然后将其传递给函数?

const tempVar:Type1 = Object

我已经尝试过了

const tempVar:Type1 = Object instanceof Type` ? Object : undefined ;

但是除了上面的错误之外,我还会收到此错误

  

“ Type1”仅引用一种类型,但在此处被用作值。

由于无法更改函数doSomething()来接受两种类型,因此是否有解决方法?

2 个答案:

答案 0 :(得分:2)

您可以创建一个custom type guard,然后调用它来缩小类型。如果函数返回true,则Typescript知道对象是指定的类型。例如:

const isTypeA = (obj: TypeA | TypeB): obj is TypeA => {
  return obj.prop1 === 'value1';
}

// elsewhere:
function somefunction(obj: TypeA | TypeB) {
  if (isTypeA(obj)) {
    // Inside this block typescript knows that obj is a TypeA, and can't be a TypeB
    doSomething(obj);
  }
}

答案 1 :(得分:1)

与 Nicholas Tower answer 一起使用的一种可能解决方案是使用 in 关键字。

复制自 docs

function move(pet: Fish | Bird) {
  if ("swim" in pet) {
    return pet.swim();
  }
  return pet.fly();
}