Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.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
Javascript TypeScript中的对象类型转换_Javascript_Typescript_Enums_Casting - Fatal编程技术网

Javascript TypeScript中的对象类型转换

Javascript TypeScript中的对象类型转换,javascript,typescript,enums,casting,Javascript,Typescript,Enums,Casting,使用enum进行类型转换在TypeScript中非常有效,直到您想通过util函数进行转换。以下是一个例子: 枚举MyType{ FIRST=“FIRST”, SECOND=“SECOND”, 第三个=“第三个” } 类型TFirst={ 类型:MyTypes.FIRST foo:string } 类型TSecond={ 类型:MyTypes.SECOND foo:string } 类型TThird={ 类型:MyTypes.THIRD 酒吧:字符串 } 类型TMyObject=TFirst |

使用
enum
进行类型转换在TypeScript中非常有效,直到您想通过util函数进行转换。以下是一个例子:

枚举MyType{
FIRST=“FIRST”,
SECOND=“SECOND”,
第三个=“第三个”
}
类型TFirst={
类型:MyTypes.FIRST
foo:string
}
类型TSecond={
类型:MyTypes.SECOND
foo:string
}
类型TThird={
类型:MyTypes.THIRD
酒吧:字符串
}
类型TMyObject=TFirst | TSecond | TThird
常量someFunction=(myObject:TMyObject)=>{
if(myObject.type==MyTypes.FIRST | | myObject.type==MyTypes.SECOND){
//这里,typescript确切地知道myObject是TFirst或TSecond
console.log(myObject.foo)
}
}
常量isFirstOrSecondUtil=(myObject:TMyObject):布尔=>{
返回myObject.type==MyTypes.FIRST | | myObject.type==MyTypes.SECOND
}
const otherFunction=(myObject:TMyObject)=>{
如果(第一个或第二个对象(myObject)){
//typescript知道myObject是TMyObject,但不知道确切的类型
console.log(myObject.foo)
}
}
您可以在中进行测试

正如您在第27行的
someFunction
TypeScript中所看到的,即使该函数接收
TMyObject
,它也完全知道
myObject
的类型是
tffirst
TSecond
。我能够使用
myObject.foo
而没有任何问题,因为这两种类型的属性都有

另一方面,我在
otherFunction
中使用util函数
isfirst或secondutil
(它执行与在
someFunction
中相同的检查),显然在这种情况下类型检查失败。在第38行,TypeScript不知道确切的类型是
myObject
。我希望能够控制台
myObject.foo
,但TypeScript失败,因为
属性“foo”在类型“TThird”上不存在。


有没有关于如何通过util函数进行正确类型转换的建议?

您可以告诉Typescript返回的布尔值指示类型:

 const isFirstOrSecondUtil = (myObject: TMyObject): myObject is TFirst | TSecond => 
   myObject.type === MyTypes.FIRST || myObject.type === MyTypes.SECOND;

哇!太棒了。谢谢你的快速回答。