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

TypeScript 中高级应用与美满实践

发布时间:2019-08-02 12:00:43 所属栏目:移动互联 来源:AlloyTeam
导读:当我们接头 TypeScript 时,我们在接头什么? TypeScript 的定位 JavaScript 的超集 编译期举动 不引入特殊开销 不改变运行时举动 始终与 ESMAScript 说话尺度同等 (stage 3 语法) TypeScript 中的 Decorator 较为非凡,为 Angular 团队和 TypeScript 团队

typeof 用于获取一个 “常量” 的范例,这里的 “常量” 是指任何可以在编译期确定的对象,譬喻 const、function、class 等。它是从 现实运行代码 通向 范例体系 的单行道。理论上,任何运行时的标记名想要为范例体系所用,都要加上 typeof。可是 class 较量非凡不必要加,由于 ts 的 class 呈现得比 js 早,现有的为兼容性办理方案。

在行使 class 时, class 名 暗示实例范例, typeof class 暗示 class 自己范例。没错,这个要害字和 js 的 typeof 要害字重名了 :)。

  1. const config = { width: 2, height: 2 }; 
  2. function getLength(str: string) { return str.length; } 
  3.   
  4. type TConfig = typeof config;    // { width: number, height: number } 
  5. type TGetLength = typeof getLength;    // (str: string) => number 

拭魅战演练

我在项目中碰着这样一种场景,必要获取一个范例中全部 value 为指定范例的 key。譬喻,已知某个 React 组件的 props 范例,我必要 “知道”(编程意义上)哪些参数是 function 范例。

  1. interface SomeProps { 
  2.     a: string 
  3.     b: number 
  4.     c: (e: MouseEvent) => void 
  5.     d: (e: TouchEvent) => void 
  6. // 怎样获得 'c' | 'd' ?  

说明一下这里的思绪,我们必要从一个 map 获得一个 set,而这个 set 是 map 的 key 的 子集,筛选子集的 前提 是 value 的范例。要结构 set 的子集,必要用到 never ;要实现前提判定,必要用到 extends ;而要实现 key 到 value 的会见,则必要索引取值。颠末一些实行后,办理方案如下。

  1. type GetKeyByValueType<T, Condition> = { 
  2.     [K in keyof T]: T[K] extends Condition ? K : never 
  3. } [keyof T]; 
  4.   
  5. type FunctionPropNames =  GetKeyByValueType<SomeProps, Function>;    // 'c' | 'd' 

这里的运算进程如下:

  1. // 开始 
  2.     a: string 
  3.     b: number 
  4.     c: (e: MouseEvent) => void 
  5.     d: (e: TouchEvent) => void 
  6. // 第一步,前提映射 
  7.     a: never 
  8.     b: never 
  9.     c: 'c' 
  10.     d: 'd' 
  11. // 第二步,索引取值 
  12. never | never | 'c' | 'd' 
  13. // never的性子 
  14. 'c' | 'd' 
编译提醒 Compiler Hints

TypeScript 只产生在编译期,因此我们可以在代码中插手一些标记,来给以编译器一些提醒,使其按我们要求的方法运行。

范例转换

范例转换的语法为 < 范例名> xxx 或 xxx as 范例名 。保举始终用 as 语法,由于第一种语法无法在 tsx 文件行使,并且轻易和泛型夹杂。一样平常只有这几种场景必要行使范例转换:自动揣度禁绝;TS 报错,想不出更好的范例编写要领,手动抄近路;姑且 “放飞自我”。

在行使范例转换时,应该遵守几个原则:

  • 若要放松限定,只可放松到能运行的最严酷范例上
  • 假如不知道一个变量的准确范例,只标注到或许范例(譬喻 any[])也比 any 好
  • 任何一段 “放飞自我”(完全没有范例包围)区代码不该高出 2 行,应在呈现第一个可以确定范例的变量时就补上标注

在编写 TS 措施时,我们的方针是让范例包围率无穷靠近 100%。

! 断言

(编辑:湖南网)

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

热点阅读