【问题标题】:How to check if object is one of union type如何检查对象是否是联合类型之一
【发布时间】:2020-02-24 20:08:28
【问题描述】:

我有 2 个接口:TypeATypeB

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

我有一个函数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() 以接受这两种类型,因此是否有解决方法?

【问题讨论】:

  • 这两种类型的区别是什么?换句话说,如果你正在编写纯 javascript,你会检查什么来判断你正在处理什么样的对象?
  • @NicholasTower 我可以检查一个名为prop1:string 的道具:` if(Object.prop1 === 'value1'){ doSomething(Object); } `

标签: typescript


【解决方案1】:

与尼古拉斯大厦answer 一起使用的一种可能解决方案是使用in 关键字。

复制自docs

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

【讨论】:

  • 我认为,在某些情况下,这甚至可能比 Tower 的答案更好。自定义类型保护的问题是没有什么能阻止程序员在比较中留下错误。使用 in 关键字将使打字稿正确猜测类型或在检查该属性不够时警告您。
【解决方案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);
  }
}

【讨论】:

  • 如果TypeA | TypeBprop1 上的可区分联合,obj.prop1 === 'value1' 将按原样工作以缩小对自定义类型 gurad 的需求。如果 union 中的类型有不同的 props,in 可能会更容易使用(if 'propInA' in obj) { ... obj is TypeA now .. }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 2021-01-22
  • 2021-10-26
  • 2023-01-13
  • 1970-01-01
  • 2017-10-28
  • 2011-09-26
相关资源
最近更新 更多