以更多打字稿的方式解决问题

时间:2019-11-30 23:46:23

标签: typescript conditional-types

我正在尝试改善解决特定问题的方式

情况。

对于每个请求,我可能都会得到一个响应|事件通知。

在处理任何一个响应的并集时| 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建模吗? 谢谢。

1 个答案:

答案 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

看起来不错。好的,希望能有所帮助;祝你好运!

Link to code