将不精确的对象的类型缩小到更具体的类型的不同方法。
简介
Type Guards随着TypeScript的使用而进入画面。这种技术被用来识别或缩小变量的类型。如果你对缩小类型不太熟悉,它意味着将一个更广泛的类型细化为一个更具体的类型的过程。
例如,一个人的广义类型可以缩小为教师、医生、农民等。主要来说,这些类型卫士是在条件块里面使用的。而Type Guard方法在运行时执行,并返回一个布尔值。
为什么是TypeScript
自从TypeScript诞生以来,我们已经能够写出优秀的代码,并将其转换为优化的vanilla JavaScript。此外,由于TypeScript是静态类型化的,它可以在编译时检测到常见的错误,也可能避免一些运行时问题。但是,在TypeScript中,我们能否在检测运行时问题方面做得更好?
Type Guards有助于检测更多TypeScript框架无法处理的运行时故障。让我们来看看TypeScript自带的最有影响力的Type Guards。
"typeof**"TypeScript**
这个关键词用于验证或识别TypeScript或JavaScript中的基本类型。只有枚举类型作为JavaScript的附加物加入到TypeScript中。在typeof关键字的帮助下,TypeScript可以识别单独声明的变量,支持下面给出的类型。
- 字符串
- 布尔型
- 数值
- 未定义
- 大数
- 职能
下面的代码片段告诉你我们如何使用typeof类型保护。
function employeeDetails(emp_: string | number) {
employeeDetails方法接受一个参数,在该方法内部,它检查该参数值的类型。第一次调用将返回雇员的姓名,第二次将返回雇员的年龄。虽然这个类型保护器很容易使用,但它只对预定义的TypeScript类型起作用。这就是typeof的主要限制。
"instanceof**"类型卫士**
instanceof Type Guard 可以作为typeof Type Guard的高级版本来介绍。typeof关键字决定了变量的类型,而操作符instanceof将决定给定对象是否具有与特定类或构造函数类似的属性。在此基础上,该操作符返回一个布尔值。
class Person {
上面的代码有两个类(Person, Animal)和一个名为helloWorld()的函数。该函数需要一个参数,在该方法中,它被instanceof操作符验证。第一个调用返回人的名字,第二个调用返回动物的腿数。
与typeof操作符不同,instanceof Type Guard只能在一个条件块中使用。它只返回一个布尔值。为了找到不精确变量的类型,我们需要将其与已知的类或构造函数类型进行比较。
关键字"in**"作为类型防护**
同样,这是一个类型卫士,我们可以用它来区分彼此的类型。in关键字检查所选对象是否包含给定的属性。根据这个条件,它将返回一个布尔值。这个关键字将有助于功能验证和避免运行时问题。
interface Animal {
上面的代码包含两个实现了动物接口的类。移动方法检查接收到的动物对象的属性。第一个调用调用了fly()方法,因为动物有属于鸟类的'羽毛颜色'属性。类似地,第二次调用到swim()方法,因为它找到了鱼类中的属性。
"等价缩小 "类型保护
等价缩小法返回一个表达式的值,这个表达式将是一个布尔值。如果两个变量的值和平方都是相同的,表达式返回为真。否则,它将返回false。这个类型守护有助于识别不精确的类型变量。例如,假设一个变量是不精确的类型(即,未知,任何等),另一个是精确的类型(即,数字,字符串等)。在这种情况下,TypeScript使用该信息来缩小第一个变量的类型。
function getValues(a: number | string, b: string) {
上面的函数需要两个参数。第一个参数是不精确的,因为我们不能保证它是一个数字或字符串。然而,第二个参数是一个字符串值,所以我们用它来缩小第一个变量的类型。
构建一个自定义的类型保护器
TypeScript拥有数量有限的预定义Type Guard。然而,我们也可以创建自定义类型防护。下面是一个自定义类型卫士的例子,以找出动物是鸟还是鱼。
interface IBird{
由于我们在创建类型守卫时,即使是最微小的错误也会导致多种错误,所以准确性是最需要考虑的。
构建可组合的Web应用
不要建立网络单体。使用 比特来创建和组成解耦的软件组件--在你喜欢的框架中,如React或Node。构建可扩展和模块化的应用程序,拥有强大和愉快的开发体验。
把你的团队带到 比特云来托管并共同协作开发组件,并作为一个团队加快、扩大和规范开发。尝试用设计系统 或微前端的可组合前端,或探索用服务器端组件的可组合后端。