目录

  • 引言
  • 联合类型
  • 交叉类型
  • 类型别名
  • 注意
  • 结论

引言

TypeScript 是一门强类型语言,其高级类型功能使得开发者能够更加灵活地定义类型并对其进行操作,以便于更好地编写可维护和可扩展的代码。
在本文中,将着重讨论三种高级类型:联合类型、交叉类型和类型别名。我们将详细介绍这些类型,并且还会提供一些有用的代码示例。

联合类型

  • 联合类型是最常见的高级类型之一,是指一个变量可以有不同的数据类型,通过 | 符号来表示,它的目的是将多个类型组合成一个类型。这些类型可以是基本类型,也可以是自定义类型

    // 联合类型的基本用法
    let myVar: string | number;
    myVar = 'hello';
    myVar = 123;
    
  • 在这里,我们定义了一个 myVar 变量,它可以是字符串或数字类型。我们可以将任何一个字符串或数字赋给 myVar 变量。
  • 联合类型用于在编写代码时可以接受多种类型的情况。例如,如果我们希望接受一个参数,它可能是字符串或数字,我们可以使用联合类型。示例如下:
    // 在函数的形参中使用联合类型
    function printId(id: number | string) {console.log(`id is ${id}`);
    }
    printId(101); // 输出:id is 101 printId("abc"); // 输出:id is abc
    
  • 在上面的代码中,我们定义了一个名为 printId 的函数,它接受一个参数 id ,它可以是数字或字符串。
    // 自定义类型
    interface Cat {name: string;purr: () => void;
    }
    interface Dog {name: string;bark: () => void;
    }
    function feedPet(pet: Cat | Dog) {console.log("Feeding " + pet.name);if ("purr" in pet) {pet.purr();} else if ("bark" in pet) {pet.bark();}
    }
    
  • 在这个例子中,我们定义了一个 feedPet 函数,它接受一个参数 pet ,这个参数是 Cat 或 Dog 类型。当我们调用这个函数时,我们可以传递一个猫或狗的对象。在函数体内,我们检查 pet 对象是否有“ purr ”或“ bark ”属性,然后相应
    地调用 pet 的方法。

联合类型的优点是在一些情况下可以简化代码,但缺点是会降低代码的可读性和可维护性。当联合类型过多时,代码的复杂度会显著增加。

交叉类型

  • 交叉类型是将多个类型组合成一个类型,通过 & 符号来表示。这些类型可以同时拥有所有类型的属性和方法。我们可以将交叉类型看作是“并集”类型。示例如下:

    interface Person {name: string;age: number;
    }
    interface Employee {company: string;
    }
    type EmployeePerson = Employee & Person;
    const employeePerson: EmployeePerson = {name: "John",age: 30,company: "ABC Inc",
    };
    console.log(employeePerson); // 输出:{ name: 'John', age: 30, company: 'ABC Inc' }
    
  • 在上面的代码中,我们定义了两个接口 Person 和 Employee 。Person 接口定义了一个人的属性(名称和年龄),而 Employee 接口定义了一个雇员的属性(公司)。我们使用 & 符号定义 EmployeePerson 类型,这个类型将 Person 和 Employee 类型组合成一个类型。最后,我们创建了一个 EmployeePerson 类型的对象,并输出它的属性。
  • 再来看一个例子:
    interface Student {name: string;age: number;
    }
    interface Teacher {name: string;teachingSubject: string;
    }
    type StudentTeacher = Student & Teacher;
    let jenny: StudentTeacher = {name: 'Jenny',age: 25,teachingSubject: 'Math'
    }
    
  • 在这里,我们定义了两个接口:Student 和 Teacher 。我们还定义了一个类型别名 StudentTeacher ,它是 Student 和 Teacher 的交集。然后我们创建一个 StudentTeacher 类型的变量 jenny ,它包含 name、age 和 teachingSubject 属性。

交叉类型的优点是可以让我们快速定义具有多种属性和方法的对象类型,但缺点是当交叉类型过多时,代码的复杂度也会显著增加。

类型别名

  • 类型别名是一种命名类型的方式,是指为一种类型定义一个新名字。类型别名可以代替较长或重复的类型定义。在 TypeScript 中,我们可以使用 type 关键字 来创建类型别名。例如:

    type UserId = number | string;
    function printUserId(id: UserId) {console.log(`id is ${id}`);
    }
    printUserId(101); // 输出:id is 101
    printUserId("abc"); // 输出:id is abc
    
  • 在上面的代码中,我们使用type关键字定义了一个类型别名 UserId ,它可以是数字或字符串。我们定义了一个名为 printUserId 的函数来接受 UserId 类型的参数。最后,我们调用这个函数两次,分别传递数字和字符串参数。
  • 再来看一个例子
    type User = {name: string;age: number;email: string;
    }
    type UserID = string | number;
    type UserCollection = Record<UserID, User>;
    let users: UserCollection = {one: {name: 'Tom',age: 20,email: 'tom@example.com'},two: {name: 'Jerry',age: 22,email: 'jerry@example.com'}
    }
    
  • 在这里,我们定义了一个类型别名 User ,它代表一个用户对象,包含 name 、age 和 email 属性。我们还定义了一个类型别名 UserID ,它是字符串或数字类型。最后,我们定义了一个类型别名 UserCollection ,它是一个以 UserID 为键,User 为值的 Record 对象,表示一个用户集合。在示例中,我们创建了一个 UserCollection 对象 users ,包含两个用户对象,它们的 ID 分别为 one 和 two 。

类型别名的优点是可以让我们轻松地定义复杂的类型,同时也可以让代码更加易读易懂。但缺点是过度使用类型别名会让代码变得冗长而难以维护。

注意

TypeScript 高级类型的联合类型、交叉类型和类型别名各具优点,我们可以在不同场景下合理地使用它们。需要注意的是,过度使用高级类型会导致代码的复杂度增加,影响代码的可读性和可维护性。因此,在使用高级类型时需要慎重考虑

结论

在本文中,我们介绍了三种高级类型:联合类型交叉类型类型别名。这些类型可以帮助我们更好地编写可维护和可扩展的代码。我们建议您在编写代码时使用这些类型,以提高代码的可读性和可维护性。

TypeScript高级类型:联合类型、交叉类型和类型别名相关推荐

  1. TypeScript 高级类型及用法

    一.高级类型 交叉类型(&) 交叉类型是将多个类型合并为一个类型.这让我们可以把现有的多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性. 语法:T & U 其返回类型既要符 ...

  2. PART16 TypeScript高级类型

    文章目录 TypeScript高级类型 class类 构造函数 实例方法 类的继承 类成员的可见性 类型兼容性 接口之间的兼容性 函数之间的兼容性 参数个数 参数类型 返回值类型 交叉类型 泛型 泛型 ...

  3. TypeScript中的联合类型、类型别名、接口、类型断言

    一.联合类型 在TypeScript中,联合类型(Union Types)是指用"|"符号将多个类型组合成一个的类型.这种类型可以包含不同的类型,例如字符串.数字或对象.这些不同类 ...

  4. Typescript - enum 枚举类型(数值型枚举 / 字符串枚举 / 常量枚举 / 异构枚举 / 计算枚举成员 / 联合枚举和枚举成员类型 / 运行时的枚举 / 环境枚举 / 对象与枚举)教程

    前言 Enums(枚举)是 TypeScript 的少数功能之一,它不是 JavaScript 的类型级扩展,仅支持数字的和基于字符串的枚举. 使用枚举您可以定义一组带名字的常量,并且清晰地表达意图或 ...

  5. TypeScript高级类型-Partial、Required、Pick、Omit、Readonly

    Partial (可选属性,但仍然不允许添加接口中没有的属性) ts中就是让一个定义中的所有属性都变成可选参数,参数可以变多也可以少. 我们定义 一个user 接口,如下 interface IUse ...

  6. 用typescript完成倒计时_TypeScript(一):类型

    经过3个月的使用,在 TypeScript 方面学到了一些东西,总结一下. 在您阅读本文之前需要了解到的是,本文的内容仅是个人观点,我也并非 TypeScript 主要维护者和贡献者,也没有邀请 Ty ...

  7. typescript学习笔记1-tsconfig.json配置和变量类型声明

    一,tsconfig.json {// 编译器选项"compilerOptions": {/* 基本选项 */"target": "es5" ...

  8. struct类型重定义 不同的基类型_C++学习大纲:联合类型

    C++联合类型 联合类型(又称共同体类型),一种能够表示多种数据(类型可以相同可以不同,变量名字不同就行)的数据类型. 1. 联合类型的定义 union {}; 与结构类型类似,只是把struct 换 ...

  9. 3dmax:3dmax三维VR渲染设置之高级灯光渲染(常规参数设置—灯光类型、阴影贴图、区域阴影、强度颜色衰减、衰退、远距衰减、聚光灯参数、大气和效果mental ray间接照明)图文教程之详细攻略

    3dmax:3dmax三维VR渲染设置之高级灯光渲染(常规参数设置-灯光类型.阴影贴图.区域阴影.强度颜色衰减.衰退.远距衰减.聚光灯参数.大气和效果mental ray间接照明)图文教程之详细攻略 ...

最新文章

  1. 使用命令行创建AVD时的出错总结
  2. iOS开发系列--无限循环的图片浏览器
  3. Python中深浅拷贝的案例教程
  4. python 多分类模型优化_【Python与机器学习】:利用Keras进行多类分类
  5. mybatis-plus的代码生成器
  6. java 着色问题 回溯算法,C语言使用回溯法解旅行售货员问题与图的m着色问题
  7. php怎么关闭全部进程,怎么关闭swoole进程
  8. 金蝶显示服务器异常,金蝶提示云服务器异常
  9. python代码模板_python 代码模板
  10. 3 FI配置-企业结构-分配-给公司分配公司代码
  11. 小学计算机表格制作教学,小学计算机年度教学工作计划表格(四篇).docx
  12. 面试中死锁的考点总结(死锁的定义、产生原因、四个必要条件、如何预防)
  13. 优秀的命令行文件传输程序(转)
  14. 一阶系统开环传递函数表达式_带钢纠偏液压系统模糊PID 控制与仿真
  15. Edge无法上网的解决方法
  16. 如果图G=V,E是哈密尔顿图,则它必然具备下述性质
  17. uc/os--OSRdyTbl
  18. MySQL数据库——初识MySQL
  19. 钉钉小程序文本框内容换行符号\n的解析处理
  20. 自研数据库CynosDB存储系统如何实现即时恢复

热门文章

  1. Hystrix之服务降级代码演示
  2. 如何将double类型的数据转换成String类型
  3. autocad锐龙英特尔_千元级CPU锐龙5 3600对决酷睿i5-10400F:游戏及创作性能对比
  4. 最新个人所得税税率表及相关计算
  5. LVS IP隧道模式(IP Tunneling)
  6. 使用 Eclipse 创建第一个 Red5 应用程序示例 - 使用 Red5 在线录制视频
  7. id 怎么获取jira 评论_JIRA使用教程:高级搜索—字段参考1/4
  8. 摆脱低效的管理,就用客户管理系统
  9. 0基础转行IT行业学web前端好吗?
  10. 微服务 —— 消息服务中间件 JMS