【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】类型保护的介绍。