Typescript 中的类型守卫是什么
当我们有特定于特定类型的逻辑时,我们会在 typescript 中使用类型保护。
用代码说话:
if (typeof someValue === 'string') {
// someValue 保证是字符串类型
// => 因此我们可以使用它执行所有字符串操作
// 比如调用 someValue.toLowerCase() 等
}
我们希望强制 typescript 允许我们使用一个值,就好像它保证是“x”类型一样。 一旦我们运行了一个类型保护,我们就明确了我们正在使用的值的类型。
function sum(a: string | number, b: string | number): string | number {
// a 和 b 是字符串或数字类型
// 因此我们只能对它们使用方法,
// 字符串和数字之间的共同点
// 即 .toString() 和 .valueOf()
if (typeof a === 'string' && typeof b === 'string') {
// a 和 b 都保证是 string 类型可以调用它们的所有字符串方法
return a.toUpperCase() + b.toUpperCase();
}
if (typeof a === 'number' && typeof b === 'number') {
// a 和 b 都保证是 number 类型可以调用它们的所有 number 方法
return a.toFixed(2) + b.toFixed(2);
}
if (typeof a === 'string' || typeof b === 'string') {
// 我们不知道 a 还是 b 是字符串,所以我们不能在其中任何一个上调用字符串方法
return String(a) + String(b);
}
// 我们已经用尽了所有的可能性,现在 a 和 b 保证是“数字”类型
return a.toFixed(2) + b.toFixed(2);
}
当我们使用联合类型时,我们经常使用类型保护,如果我们有一个非此即彼的场景,我们必须缩小我们正在使用的值的类型,以确保我们尝试执行的操作是类型安全的。
检查原语与检查对象
在上面的示例中,我们使用 typeof
来缩小类型并使用类型保护,我们只使用带有原始值的 typeof
:
- if (typeof someNumber === 'number') {保证为数字}
- if (typeof someString === 'string') {保证是字符串}
- if (typeof someBoolean === 'boolean') {保证是布尔类型}
对于非原始类型,我们使用 instanceof
:
- if (someObject instanceof someClass) {保证是 someClass 类型}
function loop(collection: string[] | string): void {
// 只能访问两者的常用方法 string[] 和 string
if (Array.isArray(collection)) {
// 集合保证是一个 string[]
collection.push('hello world');
}
// 上面是一样的
if (collection instanceof Array) {
// 集合保证是一个字 string[]
collection.push('hello world');
}
if (typeof collection === 'string') {
// 集合保证是一个 string
console.log(collection.toUpperCase());
}
}
即使 typeof
可以与对象一起使用,它也不能作为 typescript 中的类型保护。 例如,javascript 中的 typeof
数组将返回“object”,但它在 typescript 中不能用作类型保护。
每当我们想要缩小联合类型的类型并在值上恢复一组特定于类型的属性时,我们都会使用类型保护。
相关文章
在 AngularJs 中设置 Select From Typescript 的默认选项值
发布时间:2023/04/14 浏览次数:78 分类:Angular
-
本教程提供了在 AngularJs 中从 TypeScript 中设置 HTML 标记选择的默认选项的解释性解决方案。
在 Angular 中使用 TypeScript 的 getElementById 替换
发布时间:2023/04/14 浏览次数:153 分类:Angular
-
本教程指南提供了有关使用 TypeScript 在 Angular 中替换 document.getElementById 的简要说明。这也提供了在 Angular 中 getElementById 的最佳方法。
在 TypeScript 中使用 try..catch..finally 处理异常
发布时间:2023/03/19 浏览次数:181 分类:TypeScript
-
本文详细介绍了如何在 TypeScript 中使用 try..catch..finally 进行异常处理,并附有示例。
在 TypeScript 中使用 declare 关键字
发布时间:2023/03/19 浏览次数:97 分类:TypeScript
-
本教程指南通过特定的实现和编码示例深入了解了 TypeScript 中 declare 关键字的用途。
在 TypeScript 中 get 和 set
发布时间:2023/03/19 浏览次数:172 分类:TypeScript
-
本篇文章演示了类的 get 和 set 属性以及如何在 TypeScript 中实现它。
在 TypeScript 中格式化日期和时间
发布时间:2023/03/19 浏览次数:161 分类:TypeScript
-
本教程介绍内置对象 Date() 并讨论在 Typescript 中获取、设置和格式化日期和时间的各种方法。
在 TypeScript 中返回一个 Promise
发布时间:2023/03/19 浏览次数:182 分类:TypeScript
-
本教程讨论如何在 TypeScript 中返回正确的 Promise。这将提供 TypeScript 中 Returns Promise 的完整编码示例,并完整演示每个步骤。
在 TypeScript 中定义函数回调的类型
发布时间:2023/03/19 浏览次数:221 分类:TypeScript
-
本教程说明了在 TypeScript 中为函数回调定义类型的解决方案。为了程序员的方便和方便,实施了不同的编码实践指南。
在 TypeScript 中把 JSON 对象转换为一个类
发布时间:2023/03/19 浏览次数:110 分类:TypeScript
-
本教程演示了如何将 JSON 对象转换为 TypeScript 中的类。