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发现的。如果使用默认值,为什么允许未定义?我知道,但这不是问题所在,问题是为什么它不能推断此函数在never
undefined
中的结果。当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;
}