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
}
}