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);}`ifTypeA | 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();
}