Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/27.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_Reactjs_Typescript_Redux - Fatal编程技术网

Javascript 我怎样才能写出这样的代码,使typescript推断得到满足?

Javascript 我怎样才能写出这样的代码,使typescript推断得到满足?,javascript,reactjs,typescript,redux,Javascript,Reactjs,Typescript,Redux,这是一个非常简化的减速器功能 enum EnumOne { ABC = 'ABC' } enum EnumTwo { EFG = 'EFG' } interface SomethingOne { type: EnumOne foo: string } interface SomethingTwo { type: EnumTwo bar: string } function reducerFunction( action: SomethingOne | Some

这是一个非常简化的减速器功能

enum EnumOne {
  ABC = 'ABC'
}

enum EnumTwo {
  EFG = 'EFG'
}

interface SomethingOne {
  type: EnumOne
  foo: string
}

interface SomethingTwo {
  type: EnumTwo
  bar: string
}

function reducerFunction(
  action: SomethingOne | SomethingTwo
): string {
  switch(action.type) {
    case EnumOne.ABC:
      return action.foo
    case EnumTwo.EFG:
      return action.bar
  }
}
现在,我想通过如下修改上述代码,使
someReducer
一般地处理所有其他操作:

interface AnythingElse {
  type: string
}

function reducerFunction(
  action: SomethingOne | SomethingTwo | AnythingElse
) {
  switch(action.type) {
    case EnumOne.ABC:
      return action.foo
    case EnumTwo.EFG:
      return action.bar
    default: 
      return action.type
  }
}
突然之间,TypeScript无法保证当
action.type===EnumOne.ABC
action.type===enumtoo.EFG
时,动作类型分别为
SomethingOne
somethingtoo
。我相信这是因为
action
也可以是
AnythingElse
,但编译器不可能知道

我的问题是,如何以满足TypeScript的方式编写此逻辑

编辑


我知道你可以通过类型转换让TypeScript闭嘴,但我希望有人更熟悉TypeScript,并告诉我一种避免使用类型转换的方法。

你可以使用以下方法:

 interface Action<T = { [key: string]: string }> {
   type: string
   payload: T
 }
接口动作{
类型:字符串
有效载荷:T
}

函数约简函数(
行动:行动
):字符串{
开关(动作类型){
案例1.ABC:
return action.payload.foo
案例2.EFG:
返回动作.payload.bar
违约:
返回操作.type
}
}

然后返回action.paylod.foo或action.payload.Ah。无论我在没有类型转换的情况下应该提到什么:我相信没有类型转换,您可以将操作作为任何类型。或者用所有道具创建一个通用的“动作”类型。否则编译器就不会高兴了hahahah@Pedrop你能让它在这个代码沙盒中工作吗?我不认为上面的例子会满足TS编译的要求,当然!这里很抱歉,我以前编辑错了。“现在它应该可以工作了。”佩德罗普·W·博泰尔霍我可能没有很好地解释这个问题。我不想使用
any
或typecasting的原因是,我将失去TypeScript提供的类型安全性。如果您必须手动强制TypeScript接受一些安全的代码,那么您就有点违背了使用TypeScript的目的。但是,在这种情况下,可能没有办法验证
操作的类型。这正是TS试图防止的JavaScript中模棱两可的类型
function reducerFunction(
  action: Action<any>
): string {
  switch(action.type) {
    case EnumOne.ABC:
      return action.payload.foo
    case EnumTwo.EFG:
      return action.payload.bar
    default:
      return action.type
  }
 }