TypeScript: 常用的高级类型

简介: TypeScript: 常用的高级类型

今天这篇文章分享的内容挺简单,却应该引起重视,在实践场景中各种交叉使用又会让内容变得复杂。因此掌握基础不难,在实践中的思考与总结则是我们更应该随时要做的事情。


1


枚举


使用关键字enum可定义一个枚举类型。

enum Direction {
    Up = 1,
    Down,
    Left,
    Right
}
Direction.Up // 1
Direction.Down // 2
Direction.Left // 3
Direction.Right // 4

需要注意,与interface等类型约束关键字不同,枚举类型是真实运行的代码,因此枚举类型是真实存在的对象,而并非仅仅只是简单的类型约束。


如果不赋值,则从0开始递增。

enum Direction {
    Up,
    Down,
    Left,
    Right
}
Direction.Up // 0
Direction.Down // 1
Direction.Left // 2
Direction.Right // 3

也可以赋值为字符串

enum Direction {
    Up = 'up',
    Down = 'down',
    Left = 'left',
    Right = 'right'
}
Direction.Up // up
Direction.Down // down
Direction.Left // left
Direction.Right // right

可以反向映射访问

enum Direction {
    Up = 'up',
    Down = 'down',
    Left = 'left',
    Right = 'right'
}
Direction.up // Up
Direction.down // Down
Direction.left // Lfet
Direction.right // Right

前端的一个特殊性在于,我们通常会将枚举类型的值描述展示在页面上,因此此时如果使用枚举来表达会存在一些问题。

// 实践中更多使用这样方式表达枚举的含义
const sources = {
  1: '微信',
  2: 'QQ',
  3: '今日头条',
}


2


& 交叉类型


当我们在封装Drag组件时,需要兼容移动端的touch与pc端的mouse事件。可问题在于touch的事件对象与mouse的事件对象是不一样的。那么我们在兼容了这两种事件的回调中,如何去描述该回调的事件对象呢?


通常使用 & 符号来解决这样的常见,将两种类型合并为一种类型。这样就能够在智能提示中同时访问到两个事件对象的所有属性了。

type TouchEvent = React.TouchEvent & React.MouseEvent;

demo.gif


3


| 联合类型


当我们想要设定一个变量的类型为number时,

let a: number = 10;

但是当我们想要设定他的数据只能是10, 20, 30时,就需要用到 |

type Source = 10 | 20 | 30;
let a: Source = 10;

通常这种场景与枚举数据有关。


当然,我们也可以扩展一个数据的类型。

const attr: number | string = 20;

注意体会 & 与 |  的区别


4


类型保护


一个变量,被定义为可能是字符串,也可能是数组。

per: string | string[]

我们在代码编写时,希望能够自动提示对应的api,typescript则不知道应该如何处理这种情况。

试图调用数组的map方法,结果无法找到


为此,我们应该使用一些判断,帮助编辑器做出正确推断。

自动提示所有字符串api

自动提示所有数组api


这种处理,就叫做类型保护。


5


索引类型


我们可以使用 keyof 来获取一个对象中的key对应的具体值。

interface Person {
  name: string,
  age: number
}
const key: keyof Person = 'name';

结果


他有点类似于

type Key = 'name' | 'age';

但 keyof 具备更强的灵活性,它会动态的去识别对象中的所有key值。


结合泛型,用一个复杂的例子来体验一下:


我们来封装这样一个方法:对于一个对象,当我们指定对应的key值数组时,希望能够得到所有key值对应的value值数组。


需要思考几个问题。目标对象的类型,我们不确定,因此,只能使用一个泛型变量做一个简单约束。key值的类型呢?我们可以使用 keyof 从泛型对象中获取。于是又定义另外一个泛型变量 K 来接收获取的结果。


函数定义如下:

function values<T, K extends keyof T>(o: T, names: K[]): T[K][] {
  return names.map(n => o[n]);
}


6


总结


ts的知识介绍,到这里就告一段落了。这4篇文章学完,已经足够应对我们接下来要面临的React学习。也为大家进一步深入学习ts打下了坚实的基础。


我们在实践场景中,还有更多更复杂的组合,这些经验很难通过技术文章获取到,需要在实践中慢慢体会。除此之外,typescript官方文档中,还有一些重要的东西需要去深入学习。「类型推导」「类型兼容性」「in操作符」等。这些概念,官网已经介绍得足够好,相信大家看一遍也能get到。


最后,收拾收拾心情,准备React的学习吧。

相关文章
|
15小时前
|
监控 JavaScript 安全
TypeScript在员工上网行为监控中的类型安全实践
本文演示了如何使用TypeScript在员工上网行为监控系统中实现类型安全。通过定义`Website`类型和`MonitoringData`接口,确保数据准确性和可靠性。示例展示了从监控设备获取数据和提交到网站的函数,强调了类型定义在防止错误、提升代码可维护性方面的作用。
24 7
|
15小时前
|
JavaScript 安全 前端开发
【TypeScript技术专栏】TypeScript中的类型推断与类型守卫
【4月更文挑战第30天】TypeScript的类型推断与类型守卫是提升代码安全的关键。类型推断自动识别变量类型,减少错误,包括基础、上下文、最佳通用和控制流类型推断。类型守卫则通过`typeof`、`instanceof`及自定义函数在运行时确认变量类型,确保类型安全。两者结合使用,优化开发体验,助力构建健壮应用。
|
15小时前
|
JavaScript 前端开发 开发者
【TypeScript技术专栏】TypeScript类型系统与接口详解
【4月更文挑战第30天】TypeScript扩展JavaScript,引入静态类型检查以减少错误。其类型系统包括基本类型、数组等,而接口是定义对象结构的机制。接口描述对象外形,不涉及实现,可用于规定对象属性和方法。通过声明、实现接口,以及利用可选、只读属性,接口继承和合并,TypeScript增强了代码的健壮性和维护性。学习和掌握TypeScript的接口对于大型项目开发至关重要。
|
15小时前
|
JavaScript 安全 前端开发
【亮剑】TypeScript 由于其强类型的特性,直接为对象动态添加属性可能会遇到一些问题
【4月更文挑战第30天】本文探讨了在 TypeScript 中安全地为对象动态添加属性的方法。基础方法是使用索引签名,允许接受任何属性名但牺牲了部分类型检查。进阶方法是接口扩展,通过声明合并动态添加属性,保持类型安全但可能导致代码重复。高级方法利用 OOP 模式的类继承,确保类型安全但增加代码复杂性。选择哪种方法取决于应用场景、代码复杂性和类型安全性需求。
|
15小时前
|
JavaScript 前端开发
TypeScript基础类型
TypeScript基础类型
|
15小时前
|
JavaScript 前端开发
typescript 混合类型
typescript 混合类型
|
15小时前
|
JavaScript 前端开发 开发者
类型检查:结合TypeScript和Vue进行开发
【4月更文挑战第24天】TypeScript是JavaScript超集,提供类型注解等特性,提升代码质量和可维护性。Vue.js是一款高效前端框架,两者结合优化开发体验。本文指导如何配置和使用TypeScript与Vue:安装TypeScript和Vue CLI,创建Vue项目时选择TypeScript支持,配置`tsconfig.json`,编写`.tsx`组件,最后运行和构建项目。这种结合有助于错误检查和提升开发效率。
|
15小时前
|
JavaScript 编译器 开发者
TypeScript中的类型推断机制:原理与实践
【4月更文挑战第23天】TypeScript的类型推断简化编码,提高代码可读性。编译器基于变量初始值或上下文推断类型,若新值不兼容则报错。文章深入探讨了类型推断原理和实践,包括基本类型、数组、函数参数与返回值、对象类型的推断,并提醒注意类型推断的限制,如非万能、类型兼容性和适度显式指定类型。了解这些能帮助更好地使用TypeScript。
|
15小时前
|
JavaScript 前端开发 编译器
TypeScript中的高级类型:联合类型、交叉类型与条件类型深入解析
【4月更文挑战第23天】探索TypeScript的高级类型。这些特性增强类型系统的灵活性,提升代码质量和维护性。
|
15小时前
|
JavaScript 安全 编译器
TypeScript中类型断言的使用与风险
【4月更文挑战第23天】TypeScript中的类型断言用于显式指定值的类型,但在不恰当使用时可能引发运行时错误或降低代码可读性。