美文网首页
Typescript(十一)联合类型和类型守护

Typescript(十一)联合类型和类型守护

作者: camellias__ | 来源:发表于2021-06-10 14:27 被阅读0次

联合类型:通俗点说就是一个变量可能有多种类型。

比如:一个人(person)有可能是老师(teacher),也有可能是服务员(waiter),但是不可能同时是老师和服务员。

interface teacher{
    type:string;
    say:()=>{};
}
 
interface waiter{
    type:string;
    run:()=>{};
}
// 调用
function person(animal: waiter | teacher) {}

animal就是一个联合类型,但是现在直接调用animal中的方法的时候会报错:

function person2(animal: Waiter | Teacher) {
  animal.say();
}

因为,其二种接口中的方法即属性可能是不同的。

这个时候,我们就需要传说中的类型保护

一:类型保护-类型断言

类型断言就是通过断言的方式确定传递过来的准确值,比如上面的程序,如果type是teacher,说明他就是老师,这时候就可以通过断言animal as Teacher,然后直接调用say方法,程序就不再报错了。

同样如果type是waiter,说明就是服务员,这时候调用run()方法,就不会报错了。

这就是通过断言的方式进行类型保护。也是最常见的一种类型保护形式。

interface teacher{
    type:string;
    say:()=>{};
}
 
interface waiter{
    type:string;
    run:()=>{};
}
 
/**
 * 类型断言
 * @param animal 
 */
function person1(animal: waiter | teacher) 
{
    // 通过接口中的类型判断
    if (animal.type == 'teacher') 
    {
        (animal as teacher).say();
    }
    else
    {
        (animal as waiter).run();
    }
}
 

二:类型保护-in 语法

使用in来判断接口中是否有当前你要调用的语法。代码如下:

/**
 * in 语法
 * @param animal 
 */
function person2(animal: waiter | teacher) 
{
    // 通过接口中的类型判断
    if ("say" in animal) 
    {
        animal.say();
    }
    else
    {
        animal.run();
    }
}

三:类型保护-typeof语法

先来写一个新的add方法,方法接收两个参数,这两个参数可以是数字number也可以是字符串string,如果我们不做任何的类型保护,只是相加,这时候就会报错。代码如下:

/**
 * typeof 语法
 */
function add(first: string | number,secord:string | number) 
{
    return first + secord; // 这条语句会报错
}

正确的写法如下:

/**
 * typeof 语法
 */
function add(first: string | number,secord:string | number) 
{
    if(typeof first === 'string' || typeof secord === 'string')
    {
         return `${first}${secord}`;
    }
    return first + secord; 
}

四:类型保护-instanceof 语法

比如现在要作类型保护的是一个对象,这时候就可以使用instanceof语法来作。现在先写一个NumberObj的类,代码如下:

class NumberObj {
  count: number;
}

然后我们再写一个addObj的方法,这时候传递过来的参数,可以是任意的object,也可以是NumberObj的实例,然后我们返回相加值,当然不进行类型保护,这段代码一定是错误的。

function addObj(first: object | NumberObj, second: object | NumberObj) {
  return first.count + second.count;
}

报错不要紧,直接使用instanceof语法进行判断一下,就可以解决问题。

function addObj(first: object | NumberObj, second: object | NumberObj) {
  if (first instanceof NumberObj && second instanceof NumberObj) {
    return first.count + second.count;
  }
  return 0;
}

另外要说的是,instanceof 只能用在类上。这节课我大概说了四种类型保护的方式,每种方式都在不同场景中使用(还有一些不太常用的类型保护方式),可能需要自己深刻理解。

有好的建议,请在下方输入你的评论。

欢迎访问个人博客
https://guanchao.site

相关文章

  • Typescript(十一)联合类型和类型守护

    联合类型:通俗点说就是一个变量可能有多种类型。 比如:一个人(person)有可能是老师(teacher),也有可...

  • V语言学习笔记-15联合类型

    联合类型:union types或sum types 定义联合类型 语法类似typescript,使用type 和...

  • Typescript

    安装 Typescript 接口 interface 约束类型结构、Duck Typing 类型推论、联合类型、类...

  • TypeScript中的约束与类型断言(2)

    一、TypeScript中的联合类型 联合类型表示取值可以为多种类型中的一种 只能访问此联合类型的所有类型里共有的...

  • TypeScript联合类型

    联合类型(Union Types)表示取值可以为多种类型中的一种 如果赋值其它类型就会报错,比如说: 当 Type...

  • 《TypeScript》 - 联合类型

    联合类型(Union Types)可以通过管道(|)将变量设置多种类型,赋值时可以根据设置的类型来赋值。有些时候,...

  • TypeScript之联合类型和交叉类型

    这就是关于类型的组合,对类型进行逻辑运算或者说是对类型进行函数式编程。JS编程是一种编程,在JS的类型上进行编程就...

  • 学习TypeScript 接口

    TypeScript 接口定义 interface interface_name {} 实例 联合类型和接口 接口...

  • TypeScript - 类型深入

    更深入了解 TypeScript 类型系统 通过 联合类型、交叉类型、字面量类型 来满足更多的标注需求 通过 类型...

  • TypeScript高级类型:联合类型和交叉类型介绍

    TypeScript的基础类型、字面量类型、函数类型及接口类型,它们都是单一、原子的类型元素。其实,有一些稍微复杂...

网友评论

      本文标题:Typescript(十一)联合类型和类型守护

      本文链接:https://www.haomeiwen.com/subject/jzansltx.html