为什么TypeScript无法在条件语句中推断该简单类型?
TypeScript类型推断问题
先看这段代码,TypeScript可以正常完成类型推断:
let a: string | undefined; let b = ""; if(typeof a === "string"){ b = a }
但下面这段代码中,TypeScript无法正确推断类型:
let a: string | undefined; let b: string | undefined; let c = "" if(typeof a === "string" || typeof b === "string"){ c= a || b }
报错信息:
Type 'string | undefined' is not assignable to type 'string'.
Type 'undefined' is not assignable to type 'string'
不展开条件语句的正确写法
TypeScript的控制流分析无法直接关联外层的||条件与a || b表达式的类型,导致无法自动推导后者必然为字符串。以下是几种无需展开条件语句的解决方式:
非空断言(简单直接)
如果你能确定当前逻辑下a || b不可能为undefined,可以用非空断言!明确告诉TypeScript这一点:let a: string | undefined; let b: string | undefined; let c = "" if(typeof a === "string" || typeof b === "string"){ c= (a || b)! }自定义类型守卫(严谨可靠)
先定义一个类型守卫函数来明确判断值是否为字符串,再通过分支逻辑确保类型安全:function isString(value: unknown): value is string { return typeof value === "string"; } let a: string | undefined; let b: string | undefined; let c = "" if(isString(a) || isString(b)){ c= isString(a) ? a : b!; }类型断言
直接通过as string指定表达式的类型,快速解决类型不匹配问题:let a: string | undefined; let b: string | undefined; let c = "" if(typeof a === "string" || typeof b === "string"){ c= (a || b) as string; }
内容的提问来源于stack exchange,提问作者user12582392
相关产品推荐
相关产品推荐

