目录

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

引言

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. 超级计算机算200p什么意思,超级计算机一万年的运算仅需200秒,量子霸权的神话真的能实现吗?...
  2. js数组中forEach/some/every/map/filter/reduce的区别
  3. JQuery3 的新变化
  4. angular moment 倒计时_Moment 推出多款适用苹果 iPhone 12 的 MagSafe 配件:包括快速安装外接镜头保护壳 - iPhone 12...
  5. 网站down掉后,自动发信的shell
  6. 华为鸿蒙vogtloop30pro价格,华为Mate30系列基本确认:首发麒麟985+鸿蒙系统,价格感人!...
  7. Linux基础命令---ifup、ifdown
  8. linux用rsync实现同步,Linux下使用rsync实现主备机代码同步
  9. Spring Cloud —— RocketMQ 的消息类型
  10. 10g的客户端从9i的服务器中导出数据时遇到上面的问题
  11. winform文件迁移工具
  12. 目前计算机应用最广的领悟是,最新职中计算机应用基础期中考试试题及答案
  13. Illustrator中文版教程,如何在AI中以不同的方式组合形状?
  14. 19. PHP 表单验证 - 必填字段
  15. TransactNamedPipe函数
  16. Autorun 病毒清除工具
  17. 前端页面生成神器以及后端变量命名神器
  18. 【2018/10/11测试T3】葫芦
  19. 测试理论-测试用例设计 (一) --- 正交表分析法
  20. python 线程函数传参

热门文章

  1. 搭配Online:特朗普:俄罗斯及沙特将大幅减产,沙特、俄罗斯:你在无中生有
  2. win10 桌面黑屏 只剩下回收站 C:\WINDOWS\system32\config\systemprofile\Desktp不可用
  3. 木偶然-2012.12.28
  4. 计算机网络的双工方式,网卡双工模式Link Speed/Duplex Mode助电脑网速加倍
  5. python中finally的用法_python中的finally用法
  6. python使用谷歌翻译
  7. hibernate的多表联合查询
  8. 使用 Eclipse 创建第一个 Red5 应用程序示例 - 使用 Red5 在线录制视频
  9. (五十二)大白话不断在表中插入数据时,物理存储是如何进行页分裂的?
  10. 【校招VIP】产品逻辑考察之优先级