Skip to content

等值缩小

typescript 也使用分支语句做 === , !== , == ,和 != 等值检查,来实现类型缩小。例如:

typescript
function example(x: string | number, y: string | boolean) { 
  if (x === y) { 
    // 现在可以在x,y上调用字符串类型的方法了 
    x.toUpperCase(); 
    y.toLowerCase(); 
  } else { 
    console.log(x); 
    console.log(y); 
  } 
}

当我们在上面的示例中检查 x 和 y 是否相等时,TypeScript 知道它们的类型也必须相等。由于 string 是 x 和 y 都可以采用的唯一常见类型,因此TypeScript 知道 x 、 y 如果都是 string ,则程序走第一个分支中。

检查特定的字面量值(而不是变量)也有效。在我们关于真值缩小的部分中,我们编写了一个 printAll 容易出错的函数,因为它没有正确处理空字符串。相反,我们可以做一个特定的检查来阻止 null ,并且 TypeScript 仍然正确地从 strs 里移除 null 。

typescript
function printAll(strs: string | string[] | null) { 
  if (strs !== null) { 
    if (typeof strs === "object") { 
      for (const s of strs) { 
        console.log(s); 
      } 
    } else if (typeof strs === "string") { 
      console.log(strs); 
    } 
  } 
}

JavaScript 更宽松的相等性检查 == 和 != ,也能被正确缩小。如果你不熟悉,如何检查某个变量是否 == null ,因为有时不仅要检查它是否是特定的值 null ,还要检查它是否可能是 undefined 。这同样适用于 == undefined :它检查一个值是否为 null 或 undefined 。现在你只需要这个 == 和 != 就可以搞定了。

typescript
interface Container { 
  value: number | null | undefined; 
}

function multiplyValue(container: Container, factor: number) { 
  // 从类型中排除了undefined 和 null 
  if (container.value != null) { 
    console.log(container.value); 
    // 现在我们可以安全地乘以“container.value”了 
    container.value *= factor; 
  } 
}

前三个打印是通过的,第四个有问题了。