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
具有多个类型实现,但根据Typescript中的条件,只有其中一个处于活动状态_Typescript_Interface_Conditional Types - Fatal编程技术网

具有多个类型实现,但根据Typescript中的条件,只有其中一个处于活动状态

具有多个类型实现,但根据Typescript中的条件,只有其中一个处于活动状态,typescript,interface,conditional-types,Typescript,Interface,Conditional Types,试图弄清楚当给定类型有多个实现且在任何给定时间只有一个是活动的时,如何使编译器不出错 例如,我有以下两个接口: 接口fooA{ 种类:“fooA”, a:弦, b:字符串 c:字符串 } 接口fooB{ 种类:“fooB”, c:字符串 d:弦, e:字符串 } 导出类型IFoo=fooA | fooB 现在,我的方法之一是处理作为参数传入的这些道具,在任何给定时间,这两个接口中只有一个是有效的,我希望typescript只检测当前活动接口内部条件的类型。 所以它看起来像这样 someClas

试图弄清楚当给定类型有多个实现且在任何给定时间只有一个是活动的时,如何使编译器不出错

例如,我有以下两个接口:

接口fooA{
种类:“fooA”,
a:弦,
b:字符串
c:字符串
}
接口fooB{
种类:“fooB”,
c:字符串
d:弦,
e:字符串
}
导出类型IFoo=fooA | fooB
现在,我的方法之一是处理作为参数传入的这些道具,在任何给定时间,这两个接口中只有一个是有效的,我希望typescript只检测当前活动接口内部条件的类型。 所以它看起来像这样

someClass{
构造函数(foo:IFoo){
开关(食品类){
案例“fooA”:{
//对params做点什么
log(`${foo.a}-${foo.b}-${foo.c}`)
打破
}
案例“fooB”:{
//对params做点什么
log(`${foo.c}-${foo.d}-${foo.e}`)
打破
}
}
}
}
因此,在这个实现中,我得到一个错误,即。。。
类型“foo”上不存在属性“a”。
类型“fooB”上不存在属性“a”。ts(2339)


这似乎很清楚,
fooB
没有属性
a
,但是可以用typescript配置多个基于条件的接口,因此接口
fooA
在第一种情况下是活动的,而
fooB
在第二种情况下是活动的

您应该能够使用Typescript文档中概述的方法之一


使用类型谓词,或者使用
typeof
instanceof
in
,Typescript可以计算条件以缩小变量的可能类型。

好的,我想我已经解决了问题。问题是,我的结构和上面的相似,但在case语句中有一个拼写错误。我想还有一个不进行直接字符串比较的原因。
谢谢大家

您的代码工作正常。您的第一个代码片段中的两个接口称为
fooA
fooA
的重新声明是打字错误吗?除此之外,这是TypeScript中的工作代码。是的,这是一个打字错误,我的意思是把fooB放在那里,请发布一个帖子,以便其他人可以看到你在说什么。编译得很好。好的,我想我已经解决了问题。问题是,我和上面的结构相似,但为了以防万一,我有一个打字错误。谢谢大家,我已经尝试过一些类型的防护,但不知道如何才能与所呈现的场景配合使用。