如果一个变量有多种类型,读取该变量时,往往需要进行“类型缩小”(type narrowing),区分该值到底属于哪一种类型,然后再进一步处理。
function printId(id: number | string) { console.log(id.toUpperCase()); // 报错 }
上面示例中,参数变量id可能是数值,也可能是字符串,这时直接对这个变量调用toUpperCase()方法会报错,因为这个方法只存在于字符串,不存在于数值。
解决方法就是对参数id做一下类型缩小,确定它的类型以后再进行处理。
function printId(id: number | string) { if (typeof id === "string") { console.log(id.toUpperCase()); } else { console.log(id); } }
上面示例中,函数体内部会判断一下变量id的类型,如果是字符串,就对其执行toUpperCase()方法。
“类型缩小”是 TypeScript 处理联合类型的标准方法,凡是遇到可能为多种类型的场合,都需要先缩小类型,再进行处理。实际上,联合类型本身可以看成是一种“类型放大”(type widening),处理时就需要“类型缩小”(type narrowing)。
下面是“类型缩小”的另一个例子。
function getPort(scheme: "http" | "https") { switch (scheme) { case "http": return 80; case "https": return 443; } }
上面示例中,函数体内部对参数变量scheme进行类型缩小,根据不同的值类型,返回不同的结果。
来源: