Skip to content

控制流分析

到目前为止,我们已经通过一些基本示例来说明 TypeScript 如何在特定分支中缩小范围。但是除了从每个变量中走出来,并在 if 、 while 、条件等中寻找类型保护之外,还有更多的事情要做。例如:

typescript
function padLeft(padding: number | string, input: string) { 
  if (typeof padding === "number") { 
    return new Array(padding + 1).join(" ") + input; 
  }
  return padding + input; 
}

padLeft 从其第一个 if 块中返回。TypeScript 能够分析这段代码,并看到在 padding 是数字的情况下,主体的其余部分( return padding + input; )是不可达的。因此,它能够将数字从 padding 的类型中移除(从字符串|数字缩小到字符串),用于该函数的其余部分。

这种基于可达性的代码分析被称为控制流分析,TypeScript使用这种流分析来缩小类型,因为它遇到了类型守卫和赋值。当一个变量被分析时,控制流可以一次又一次地分裂和重新合并,该变量可以被观察到在每个点上有不同的类型。

typescript
function example() { 
  let x: string | number | boolean; 
  
  x = Math.random() < 0.5; 
  
  // let x: boolean 
  console.log(x); 
  
  if (Math.random() < 0.5) {
    x = "hello"; 
    // let x: string 
    console.log(x); 
  } else { 
    x = 100; 
    // let x: number 
    console.log(x); 
  }
  // let x: string | number 
  return x; 
}

let x = example() 
x = 'hello' 
x = 100 
x = true // error