Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 如何检查对象是否为联合类型_Typescript - Fatal编程技术网

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

Typescript 如何检查对象是否为联合类型,typescript,Typescript,我有两个接口:TypeA和TypeB 我的React脚本接收类型为TypeA | TypeB的对象object 我有一个函数doSomething(属性:TypeA) 我想将对象作为属性传递,如doSomething(Object), 但是TS说 类型“TypeA | TypeB”不可分配给类型“TypeA”。 类型“TypeB”缺少类型“TypeA”中的以下属性:prop1、prop2、prop3 也许我只能在类型为TypeA的情况下设置一个新的临时变量,然后将其传递给函数 const tem

我有两个接口:
TypeA
TypeB

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

我有一个函数
doSomething(属性:TypeA)
我想将
对象
作为属性传递,如
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()
以接受这两种类型,因此是否有解决方案?

您可以创建一个,并调用该函数以缩小类型范围。如果函数返回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);
  }
}

与Nicholas Tower一起使用的一个可能的解决方案是在关键字中使用

抄袭自


这两种类型有什么区别?换句话说,如果你在编写纯javascript,你会检查什么来告诉你正在处理什么类型的对象?@NicholasTower有一个名为
prop1:string
的道具,我可以检查:`if(object.prop1=='value1'){doSomething(object);}`if
TypeA | TypeB
prop1
上的一个有区别的联合体,
obj.prop1===“value1”
将按原样工作,以减少对自定义类型gurad的需求。如果联盟中的类型在
中有不同的道具,那么使用起来可能会更简单(
如果obj中的“propInA”{…obj现在是TypeA..}
我认为,在某些情况下,这可能比Tower的答案更好。自定义类型保护的问题在于没有任何东西可以阻止程序员在比较中留下bug。使用in关键字将使typescript正确猜测类型,或者在检查该属性还不够时警告您。
function move(pet: Fish | Bird) {
  if ("swim" in pet) {
    return pet.swim();
  }
  return pet.fly();
}