Typescript 如果返回语句在switch语句之外,则错误推断的函数返回类型
给定Typescript 如果返回语句在switch语句之外,则错误推断的函数返回类型,typescript,Typescript,给定 const ACTION\u 1=“ACTION\u 1”; 键入ACTION_1=“ACTION_1”; const ACTION_2=“ACTION_2”; 键入ACTION_2=“ACTION_2”; 类型ActionTypes= |行动1 |行动2 导出型减速器=( 状态:S |未定义, 动作:动作类型 )=>S 当我有这个减速机时: const ACTION_1 = "ACTION_1"; type ACTION_1 = "ACTION_1"; const ACTION_2
const ACTION\u 1=“ACTION\u 1”;
键入ACTION_1=“ACTION_1”;
const ACTION_2=“ACTION_2”;
键入ACTION_2=“ACTION_2”;
类型ActionTypes=
|行动1
|行动2
导出型减速器=(
状态:S |未定义,
动作:动作类型
)=>S
当我有这个减速机时:
const ACTION_1 = "ACTION_1";
type ACTION_1 = "ACTION_1";
const ACTION_2 = "ACTION_2";
type ACTION_2 = "ACTION_2";
type ActionTypes =
| ACTION_1
| ACTION_2
export type Reducer<S = any> = (
state: S | undefined,
action: ActionTypes
) => S
const reducer:reducer=(
state=false,
行动
) => {
开关(动作){
案例行动1:
返回true;
案例行动2:
返回false;
违约:
}
返回状态;
}
在严格模式下它抱怨此函数的返回类型为IState | undefined
,但当我交换返回状态时
在switch语句中,对于默认值:返回状态的结尾处,一切正常。甚至只是一个空的默认值:
,并将return语句留在底部,也会安抚编译器
对于返回类型,它甚至可以在vscode中识别返回语句是不可访问的。我理解它必须考虑到这一点,因为运行时它不知道switch语句是否确实详尽无遗
但即使我有默认值,它也知道返回肯定是不可访问的,而且它仍然抱怨这个函数可能返回IState | undefined
甚至这也是错误的,因为state
参数有一个默认值。所以它从来都不是未定义的
这是虫子吗?还是已知的限制
这在typescript版本3.8中得到了修复。您允许状态由于您的Reducer
类型而未定义(状态:S |未定义,
),我假设这就是typescript发现的。如果使用默认值,为什么允许未定义?我知道,但这不是问题所在,问题是为什么它不能推断此函数在neverundefined
中的结果。当switch语句外有return语句时。当开关中有一个默认值时,它可以推断它从来都不是未定义的?我无法重新创建3.6.2上的错误。答案似乎是这是Typescript中的错误,因为空的默认值:
标签应该没有效果,但在这里我们可以看到它确实有效果。我建议尝试将其简化为复制行为的最短/最简单的代码,并在TS问题跟踪器上发布问题:我认为可能是这样的:
const reducer: Reducer<boolean> = (
state = false,
action
) => {
switch (action) {
case ACTION_1:
return true;
case ACTION_2:
return false;
default:
}
return state;
}