【TypeScript】类型保护(六)


【TypeScript】类型保护(六)


在这里插入图片描述

一、什么是类型保护

类型保护是一种在 TypeScript 中使用的技术,它允许您在运行时检查变量的类型,以便更好地确定如何处理变量。

在 TypeScript 中实现类型保护有多种方法。如typeof操作符、instanceof操作符、 in操作符、自定义类型谓词函数

它们可用于增强类型安全性,并提高代码的可读性和可维护性。

主要的四种类型守卫:

  • typeof操作符
  • instanceof操作符
  • in操作符
  • 自定义类型谓词函数
二、typeof操作符

语法: typeof 变量

形如上述语法,使用 typeof 进行变量类型的检测,然后根据类型进行不同的操作。


function updatePadding(value: string, padding: string | number) {
    
    
    if (typeof padding === "number") {
    
    
        return Array(padding + 1).join(" ") + value;
    }
    if (typeof padding === "string") {
    
    
        return padding + value;
    }
    throw new Error(`Expected string or number, got '${
      
      padding}'.`);
}

如上说明,定义 updatePadding 方法函数,根据 padding 的类型,进行不同的处理。

需要注意的是,typeof只能识别基础类型,如 number、string、boolean、symbol、undefined,对于其他类型,则检测结果object

在这里插入图片描述
总的来说,特定情况下的 typeof使用是没有问题的,但是对于对象类型属性的检测还是有限制。

三、instanceof操作符

语法:对象A instanceof 对象B

其中,对象A 是要判断的对象,对象B 是要判断的类。
如果 对象A对象B 的实例,则返回 true,否则返回 false。
针对typeof不能处理的情况,我们其实可以使用instanceof操作符进行处理。

class Student {
    
    
  name: string;
  age: number;
  
  constructor(name: string, age: number) {
    
    
    this.name = name;
    this.age = age;
  }
}

const student = new Student('suwu150', 28);

if (student instanceof Student) {
    
    
  console.log(student.name, student.age); // 输出:suwu150 28
}

在示例中,通过 student instanceof Student 判断 student 是否是 Student 类的实例,如果是则输出 student.name 和 student.age。

编译后结果:

"use strict";
var Student = /** @class */ (function () {
    
    
    function Student(name, age) {
    
    
        this.name = name;
        this.age = age;
    }
    return Student;
}());
var student = new Student('suwu150', 28);
if (student instanceof Student) {
    
    
    console.log(student.name, student.age); // 输出:suwu150 28
}
四、in操作符

语法:nameA in object

形如语法中所描述,在 TypeScript 中,in 操作符 用于判断某个属性是否存在于一个对象中。

其中,nameA 表示要判断的属性名或者数组的索引值,object 表示要判断的对象或数组。

interface Student {
    
    
  name: string;
  age: number;
}

const student: Student = {
    
    
  name: "suwu150",
  age: 30
};

console.log("name" in student);   // true
console.log("gender" in student); // false

在上面的示例中,我们定义了一个 Student 接口,并创建一个 student 对象。使用 in 操作符 判断 student 对象中是否有 name 和 gender 属性,结果分别为 true 和 false。

五、自定义类型谓词函数

语法:nameA is Type

nameA 必须是来自于当前函数签名里的一个参数名

在 TypeScript 中,可以使用类型谓词函数来定义自定义类型检查方法。类型谓词函数是一个函数,它的返回值为一个布尔值,并且在函数体内使用了类型断言。它可以用于判断一个值是否为某种类型,从而提高类型的安全性。

function isString(value: unknown): value is string {
    
    
  return typeof value === 'string';
}

function example(input: unknown) {
    
    
  if (isString(input)) {
    
    
    // TypeScript 现在知道 input 是 string 类型
    console.log(input.toUpperCase());
  } else {
    
    
    console.log('Input is not a string.');
  }
}

在上面的代码中,value is string 就是类型谓词,isString 函数的返回类型被指定为 value is string,这表示如果该函数返回 true,则 TypeScript 将知道传入的参数是 string 类型。

在 example 函数中,如果 input 是 string 类型,则使用 toUpperCase 方法,否则输出错误消息。

编译后结果:

"use strict";
function isString(value) {
    
    
    return typeof value === 'string';
}
function example(input) {
    
    
    if (isString(input)) {
    
    
        // TypeScript 现在知道 input 是 string 类型
        console.log(input.toUpperCase());
    }
    else {
    
    
        console.log('Input is not a string.');
    }
}

通过使用类型谓词函数,我们可以在 TypeScript 中创建更加灵活和类型安全的代码。


以上就是【TypeScript】类型保护的介绍。




猜你喜欢

转载自blog.csdn.net/suwu150/article/details/132255177
今日推荐