TypeScript: 常用的高级类型

简介: 枚举使用关键字enum可定义一个枚举类型。enum Direction { Up = 1, Down, Left, Right}Direction.Up // 1Direction.Down // 2Direction.Left // 3Direction.Right // 4需要注意,与interface等类型约束关键字不同,枚举类型是真实运行的代码,因此枚举类型是真实存在的对象,而并非仅仅只是简单的类型约束。

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;


微信图片_20220511153428.gif


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则不知道应该如何处理这种情况。


微信图片_20220511153432.gif


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


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


微信图片_20220511153435.png

自动提示所有字符串api


微信图片_20220511153438.png


自动提示所有数组api


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


5


索引类型


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


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


微信图片_20220511153441.png

结果


他有点类似于


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的学习吧。

相关文章
|
1月前
|
前端开发 JavaScript 安全
TypeScript在React Hooks中的应用:提升React开发的类型安全与可维护性
【7月更文挑战第17天】TypeScript在React Hooks中的应用极大地提升了React应用的类型安全性和可维护性。通过为状态、依赖项和自定义Hooks指定明确的类型,开发者可以编写更加健壮、易于理解和维护的代码。随着React和TypeScript的不断发展,结合两者的优势将成为构建现代Web应用的标准做法。
|
7天前
|
JavaScript
TypeScript——不能将类型“HTMLElement | null”分配给类型“HTMLElement”
TypeScript——不能将类型“HTMLElement | null”分配给类型“HTMLElement”
18 4
|
11天前
|
JavaScript 编译器
typescript 解决变量多类型访问属性报错--工作随记
typescript 解决变量多类型访问属性报错--工作随记
|
6天前
|
JavaScript
TypeScript——Record类型
TypeScript——Record类型
12 0
|
11天前
|
JavaScript 前端开发 编译器
Typescript 回调函数、事件侦听的类型定义与注释--拾人牙慧
Typescript 回调函数、事件侦听的类型定义与注释--拾人牙慧
|
1月前
|
JavaScript 开发者 索引
TypeScript接口与类型别名:深入解析与应用实践
【7月更文挑战第10天】TypeScript的接口和类型别名是定义类型的关键工具。接口描述对象结构,用于类、对象和函数参数的形状约束,支持可选、只读属性及继承。类型别名则为复杂类型提供新名称,便于重用和简化。接口适合面向对象场景,类型别名在类型重用和复杂类型简化时更有优势。选择时要考虑场景和灵活性。
|
1月前
|
JavaScript 前端开发 程序员
Typescript 【实用教程】(2024最新版)含类型声明,类型断言,函数,接口,泛型等
Typescript 【实用教程】(2024最新版)含类型声明,类型断言,函数,接口,泛型等
37 0
|
1月前
|
JavaScript 安全
TypeScript(十一)泛型工具类型
TypeScript(十一)泛型工具类型
23 0
|
1月前
|
JavaScript 前端开发 编译器
TypeScript(五)类型别名及类型符号
TypeScript(五)类型别名及类型符号
26 0
|
1月前
|
JavaScript 前端开发
TypeScript(二)基本类型和特殊类型
TypeScript(二)基本类型和特殊类型
17 0