Narrowing
凭借 TypeScript ,它可以对许多类型进行自动 narrowing,以此来更好的辅助 coding
typeof
typeof 返回以下 8 种类型。
"string""number""bigint""boolean""symbol""undefined""object""function"
Truthiness
在 JavaScript 中,Array, null 都是 object 类型
typeof null
> 'object'因此,如果要通过 typeof 来判断一个变量是否为 array 可能会带来意想不到的问题,考虑以下代码:
如果使用 JavaScript 编写,上述问题就不能被正确发现,好在 TypeScript 会帮你指出这一问题,因此正确的解决方法是:
==, !=
Typescript 在判断 x != undefined 的时候,会同时判断 x != null,反之依然(x == undefined);同时,在判断 x != null 的时候,也会同时判断 x != undefined ,反之亦然。
自定义类型保护
我们可以自己封装一个判断函数,来判断某一变量是否为指定的类型
使用 <var> is <type> 谓词作为这个判断函数的返回值,ts 会在 if 逻辑后 narrow 它的类型

bar 已经从 any narrow 到 string 了,因此会直接报错
那么为什么不直接返回一个 boolean 呢?
TypeScript 的 narrowing 机制需要借助 is 来实现,因此直接返回一个 boolean 并不可行

在 if 逻辑后,ts 并不能正确地 narrow bar 的属性,它仍然是一个 any
Discriminated unions
定义两种 Shape,Circle 和 Square,它们都有一个 kind 属性
那么在 if 逻辑中对 kind 进行判断,相当于进行了 narrow
也可以使用 switch 语句对 kind 进行遍历
never type
如果 TypeScript 不断地 narrowing,直到没有一个类型都没有剩下,那这时候它就是 never 类型
Last updated