如何在TypeScript中使用条件中的变量缩小类型?

如何在TypeScript中使用条件中的变量缩小类型?,typescript,Typescript,以下内容无法编译: 函数returnString():string{ const s=Math.random()

以下内容无法编译:

函数returnString():string{
const s=Math.random()<0.5?:空;
const sIsString=s!==null;
if(字符串){

返回s;//调用了可以缩小联合类型变量(如
s
)范围的机制,但它仅在每个变量的基础上发生

编译器无法在相关变量
s
sIsString
之间建立连接。因此,如果
sIsString
true
,则您知道
s!==null
,但TS不知道。它只是查看
s
sIsString
,就好像它们是完全独立的一样


第二种情况有效,因为您直接对变量
s
执行类型保护检查,并且如上所述,控制流分析对每个变量有效。因此,在
s!==null
类型检查之后,它的联合类型
string
可以适当地缩小为
string

您可以用
return s!
,从而断言您正在返回一个非空值。或者禁用
stricnullcheck
编译器标志。如果启用此选项,编译器将无法推断返回值始终是
hey
,而不考虑分支。这两个修复程序都能够处理此问题。请告诉我这是否适合您这是一个可能的答案。嘿,Wiktor,感谢您的关注。我知道这些解决方案,但我希望找到一个解释,说明为什么这些解决方案首先是必要的。我将等待一点,看看是否有人可以解释为什么编译器无法推断类型断言,或者是否有一个不太老练的解决方案。没问题,我不明白e您的实际问题是什么。幸运的是,下面提供的答案指向负责分支分析的编译器功能,该功能检测到
if(s!==null)返回s
,而
if(whateverelse)返回s
。相关的GitHub问题(用于对此的“权威”或“规范”答案):谢谢@jcalz!太棒了,非常有帮助。谢谢@ford04和@jcalz!