加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 移动互联 > 正文

TypeScript 中高级应用与完美实践

发布时间:2019-08-01 17:03:16 所属栏目:移动互联 来源:AlloyTeam
导读:当我们讨论 TypeScript 时,我们在讨论什么? TypeScript 的定位 JavaScript 的超集 编译期行为 不引入额外开销 不改变运行时行为 始终与 ESMAScript 语言标准一致 (stage 3 语法) TypeScript 中的 Decorator 较为特殊,为 Angular 团队和 TypeScript 团队

TypeScript 的复合类型可以分为两类: set 和 map 。set 是指一个无序的、无重复元素的集合。而 map 则和 JS 中的对象一样,是一些没有重复键的键值对。

  1. // set 
  2. type Size = 'small' | 'default' | 'big' | 'large'; 
  3. // map 
  4. interface IA { 
  5.     a: string 
  6.     b: number 

复合类型间的转换

  1. // map => set 
  2. type IAKeys = keyof IA;    // 'a' | 'b' 
  3. type IAValues = IA[keyof IA];    // string | number 
  4.   
  5. // set => map 
  6. type SizeMap = { 
  7.     [k in Size]: number 
  8. // 等价于 
  9. type SizeMap2 = { 
  10.     small: number 
  11.     default: number 
  12.     big: number 
  13.     large: number 

map 上的操作

  1. // 索引取值 
  2. type SubA = IA['a'];    // string     
  3.   
  4. // 属性修饰符 
  5. type Person = { 
  6.     age: number 
  7.     readonly name: string    // 只读属性,初始化时必须赋值 
  8.     nickname?: string    // 可选属性,相当于 | undefined 

映射类型和同态变换

在 TypeScript 中,有以下几种常见的映射类型。它们的共同点是只接受一个传入类型,生成的类型中 key 都来自于 keyof 传入的类型,value 都是传入类型的 value 的变种。

  1. type Partial<T> = { [P in keyof T]?: T[P] }    // 将一个map所有属性变为可选的 
  2. type Required<T> = { [P in keyof T]-?: T[P] }    // 将一个map所有属性变为必选的 
  3. type Readonly<T> = { readonly [P in keyof T]: T[P] }    // 将一个map所有属性变为只读的 
  4. type Mutable<T> = { -readonly [P in keyof T]: T[P] }    // ts标准库未包含,将一个map所有属性变为可写的 

此类变换,在 TS 中被称为同态变换。在进行同态变换时,TS 会先复制一遍传入参数的属性修饰符,再应用定义的变换。

  1. interface Fruit { 
  2.     readonly name: string 
  3.     size: number 
  4. type PF = Partial<Fruit>;    // PF.name既只读又可选,PF.size只可选 

其他常用工具类型

由 set 生成 map

  1. type Record<K extends keyof any, T> = { [P in K]: T }; 
  2.   
  3. type Size = 'small' | 'default' | 'big'; 
  4. /* 
  5.     small: number 
  6.     default: number 
  7.     big: number 
  8.  */ 
  9. type SizeMap = Record<Size, number>; 

保留 map 的一部分

  1. type Pick<T, K extends keyof T> = { [P in K]: T[P] }; 
  2. /* 
  3.     default: number 
  4.     big: number 
  5.  */ 
  6. type BiggerSizeMap = Pick<SizeMap, 'default' | 'big'>; 
  7.   

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读