当前位置: 首页 > 知识库问答 >
问题:

前端 - TypeScript if/else 语句中类型收窄问题?

井修雅
2024-06-06

53265df8710008889b4c67bcc90ca68.png
为什么if片段内的isCache类型被收窄为true,而else片段内的isCache类型推导是boolean。我预期的是else片段内的isCache类型应该推导为false,求解答。

尝试了一下应该不是编辑器的问题。

共有2个答案

马哲
2024-06-06

你可能需要提供更多的信息来确定原因。
比如创建一个空白的TS文件来写类似的代码,看能不能正确收窄。
我这里创建一个类似的结构,else里正常收窄为false

穆德海
2024-06-06

在 TypeScript 中,当你使用类型守卫(比如 if (someValue instanceof SomeType))或者通过检查字面量来缩小变量的类型时,TypeScript 编译器会根据条件语句的结果来推断变量的可能类型。然而,ifelse 分支中变量的类型收窄并不是完全对称的。

在你的例子中,isCache 很可能是一个联合类型,比如 boolean | undefined 或者 boolean | null。当你在 if 语句中检查 isCache 是否为 true 时,TypeScript 能够确定在 if 分支中 isCache 的类型为 true,因为已经通过条件检查排除了 isCachefalse 或其他值的可能性。

然而,在 else 分支中,TypeScript 仍然将 isCache 的类型推导为原始联合类型中除了 true 之外的所有可能类型。这是因为 else 分支涵盖了 isCachefalse 或原始联合类型中除了 true 之外的其他任何值的所有情况。编译器不会进一步将其收窄为 false,因为它不能确定 isCache 是否可能为 undefinednull(如果这些是原始联合类型的成员的话)。

举个例子,如果 isCache 的类型是 boolean | undefined,那么 else 分支中的 isCache 可能是 falseundefined。编译器不会假设 isCacheelse 分支中一定是 false,因为这样会忽略 undefined 的可能性。

要解决这个问题,你可以显式地检查 isCache 是否为 false 或者使用类型断言(尽管类型断言应该谨慎使用,因为它会绕过 TypeScript 的类型检查)。但通常更好的做法是确保你的变量在使用前已经被正确初始化或赋值,这样你就不需要处理 undefinednull 的情况了。

总结一下,else 分支中的 isCache 类型没有被推导为 false 是因为 TypeScript 编译器需要考虑到 isCache 可能是联合类型中的其他值,而不仅仅是 false

 类似资料:
  • Swift 条件语句 一个 if 语句 后可跟一个可选的 else if...else 语句,else if...else 语句 在测试多个条件语句时是非常有用的。 当你使用 if , else if , else 语句时需要注意以下几点: if 语句后可以有 0 个或 1 个 else,但是如果 有 else if 语句,else 语句需要在 else if 语句之后。 if 语句后可以有 0

  • else语句可以与if语句结合使用。 else语句包含else语句中的条件表达式解析为0或FALSE值时执行的代码块。 else语句是一个可选语句, else后面最多只能有一个else语句。 语法 (Syntax) if...else语句的语法是 - if expression: statement(s) else: statement(s) 流程图 (Flow Diagram) 例

  • 着色器语言GLSL中关于if语句、for语句的使用,和javascript语言、C语言中的if语句、for语句执行逻辑规则基本一致,这里默认你已经有一定的编程基础,也就不做过多讲解,只是简单说明一下。 单独使用if if(x>100){ gl_FragColor = vec4(1.0,0.0,0.0,1.0);//红色 } if-else形式 bool colorBool; // 根据布尔值

  • 主要内容:if 语句,实例,if...else 语句,实例,if...else if...else 语句,实例,if...else 嵌套语句,实例Scala IF...ELSE 语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块。 可以通过下图来简单了解条件语句的执行过程: if 语句 if 语句有布尔表达式及之后的语句块组成。 语法 if 语句的语法格式如下: 如果布尔表达式为 true 则执行大括号内的语句块,否则跳过大括号内的语句块,执行大括号之后的语句块。 实

  • 主要内容:if 结构,if-else 结构,多条件 if-else-if 语句,嵌套 if 的使用Java 支持两种选择语句:if 语句和 switch 语句。其中 if 语句使用布尔表达式或布尔值作为分支条件来进行分支控制,而 switch 语句则用于对多个整型值进行匹配,从而实现分支控制。这些语句允许你只有在程序运行时才能知道其状态的情况下,控制程序的执行过程。如果你没有 C/ C++ 的编程背景,你将会为这两个语句的强大功能和灵活性而感到吃惊。 选择结构(也叫分支结构)解决了顺序结构不能

  • Scala IF...ELSE 语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块。 可以通过下图来简单了解条件语句的执行过程: if 语句 if 语句有布尔表达式及之后的语句块组成。 语法 if 语句的语法格式如下: if(布尔表达式) { // 如果布尔表达式为 true 则执行该语句块 } 如果布尔表达式为 true 则执行大括号内的语句块,否则跳过大括号