如题,is 关键字是 TS 类型断言的一种方式。
我们常用的是另一种,as。as 能满足我们基本的类型断言的需要,如我们单纯的想打印一个变量的某个属性,或者调用它的函数,我们只想执行一次这样的操作,那么 as 就能很好的工作了。
但是有时我们需要对这个变量做一系列的操作,如果每次都需要 as 断言一下,那么就会显得很麻烦,有没有什么办法能实现一次断言,多次操作呢?is 关键字就是来做这个的。
is 关键字用来让用户实现 “类型守卫”,实际上就是一个函数,用来判断类型,类型守卫经常和条件判断一块使用,在判断成功后的代码块中均可认为变量是断言的那个类型,无需每次都 as。
// 自定义类型守卫函数 function isEvenNumber(num: any): num is number { return typeof num === "number" && num % 2 === 0; } // 使用 is 进行类型断言 function doubleIfEven(num: any): any { if (isEvenNumber(num)) { // 无论执行多少次操作,都认为 num 是偶数类型 return num * 2; } else { return "Not an even number"; } } console.log(doubleIfEven(2)); // 输出:4 console.log(doubleIfEven("2")); // 输出:"Not an even number"
类型守卫的参数可以是任意类型,只要能帮你做判断即可:
interface Circle { kind: 'circle'; radius: number; } interface Square { kind: 'square'; sideLength: number; } // 联合类型 type Shape = Circle | Square; function isCircle(shape: Shape): shape is Circle { return shape.kind === 'circle'; } function calculateArea(shape: Shape) { if (isCircle(shape)) { // 在这里,shape 被类型细化为 Circle 类型 return Math.PI * shape.radius * shape.radius; } else { // 在这里,shape 被类型细化为 Square 类型 return shape.sideLength * shape.sideLength; } }