我正在尝试改善解决特定问题的方式
情况。
对于每个请求,我可能都会得到一个响应|事件通知。
在处理任何一个响应的并集时| EventNotification,如果不使用类型转换,然后分支到if语句,我似乎无法解决
示例:
请求:
{
type: 'something', age: 22
}
响应可以是:
type TypeOne = {
Response: { key: 'key', age: 22}
}
或
TypeTwo = {
EventNotification: { key: 'trying to process your request' , age: 33
}
}
然后,我有一个正在接受此响应并尝试分支的函数,但是为了使分支正常工作,我必须进行类型转换。
const a = response as TypeOne
const b = response as typeTwo
if(a){
// do stuff here safely.
}else {
// do stuff here safely.
}
我仍然必须检查两者是否存在,但我不想强制转换。 我希望我能使自己清楚。 另一点可能是: 如何在一个类型中的某个位置上,当一个属性被检查为真实时,例如在if语句中,则无法访问另一个属性?那有可能吗?。
说:
Type A = {
KeyOne?: { name: string, age: number},
KeyTwo?: { name: string, height: number}
}
const fn = (a:A) => {
if(a.KeyOne) {
// access OK
// a.KeyTwo doesn't exist
} else if(a.KeyTwo) {
// access OK;
// a.KeyOne doesn't exist type Error;
}
}
该脚本可以用Typescript建模吗? 谢谢。
答案 0 :(得分:2)
这听起来像您想要一个union type作为discriminated union的角色,您可以在其中检查一个属性以过滤联合。这是我的处理方式:
type A =
{ KeyOne: { name: string, age: number }, KeyTwo?: never } |
{ KeyOne?: never, KeyTwo: { name: string, height: number } }
类型A
是两种可能的类型之一:具有定义的KeyOne
属性的对象和undefined
KeyTwo
属性(类型{{1 }}始终是never
,或者是具有已定义的undefined
属性和KeyTwo
undefined
属性的对象。从TypeScript 3.2开始,this acts as a discriminated union。您可以看到它按预期运行:
KeyOne
看起来不错。好的,希望能有所帮助;祝你好运!