推荐答案
TypeScript 中的类型保护(Type Guards)是一种机制,用于在运行时检查变量的类型,并在代码块中缩小该变量的类型范围。通过类型保护,开发者可以在特定的代码块中安全地使用特定类型的属性和方法,而不会引发类型错误。
常见的类型保护方式包括:
- typeof 类型保护:用于检查基本类型(如
string、number、boolean等)。 - instanceof 类型保护:用于检查类的实例。
- 自定义类型保护:通过定义一个返回类型谓词(
parameterName is Type)的函数来实现。
类型保护的作用是帮助 TypeScript 编译器在特定代码块中推断出更精确的类型,从而避免不必要的类型断言或类型错误。
本题详细解读
1. typeof 类型保护
typeof 类型保护用于检查变量的基本类型。例如:
function printValue(value: string | number) {
if (typeof value === "string") {
console.log(value.toUpperCase()); // 这里 value 被推断为 string 类型
} else {
console.log(value.toFixed(2)); // 这里 value 被推断为 number 类型
}
}在上面的例子中,typeof value === "string" 是一个类型保护,它告诉 TypeScript 编译器在 if 块中 value 是 string 类型,而在 else 块中 value 是 number 类型。
2. instanceof 类型保护
instanceof 类型保护用于检查一个对象是否是某个类的实例。例如:
// www.javascriptcn.com code example
class Dog {
bark() {
console.log("Woof!");
}
}
class Cat {
meow() {
console.log("Meow!");
}
}
function makeSound(animal: Dog | Cat) {
if (animal instanceof Dog) {
animal.bark(); // 这里 animal 被推断为 Dog 类型
} else {
animal.meow(); // 这里 animal 被推断为 Cat 类型
}
}在这个例子中,animal instanceof Dog 是一个类型保护,它帮助 TypeScript 编译器在 if 块中推断 animal 是 Dog 类型,而在 else 块中推断 animal 是 Cat 类型。
3. 自定义类型保护
自定义类型保护是通过定义一个返回类型谓词(parameterName is Type)的函数来实现的。例如:
// www.javascriptcn.com code example
interface Bird {
fly(): void;
}
interface Fish {
swim(): void;
}
function isFish(pet: Bird | Fish): pet is Fish {
return (pet as Fish).swim !== undefined;
}
function move(pet: Bird | Fish) {
if (isFish(pet)) {
pet.swim(); // 这里 pet 被推断为 Fish 类型
} else {
pet.fly(); // 这里 pet 被推断为 Bird 类型
}
}在这个例子中,isFish 是一个自定义类型保护函数,它通过检查 pet 是否具有 swim 方法来判断 pet 是否是 Fish 类型。pet is Fish 是类型谓词,它告诉 TypeScript 编译器在 if 块中 pet 是 Fish 类型。
4. 类型保护的作用
类型保护的主要作用是:
- 缩小类型范围:在特定的代码块中,TypeScript 编译器可以推断出更精确的类型。
- 避免类型错误:通过类型保护,开发者可以安全地访问特定类型的属性和方法,而不会引发类型错误。
- 提高代码可读性:类型保护使代码的逻辑更加清晰,减少了类型断言的使用。