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

TypeScript 中高级应用与美满实践

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

删除 map 的一部门

  1. type Omit<T, K> = Pick<T, Exclude<keyof T, K>>; 
  2. /* 
  3.     default: number 
  4.  */ 
  5. type DefaultSizeMap = Omit<BiggerSizeMap, 'big'>; 

保存 set 的一部门

  1. type Extract<T, U> = T extends U ? T : never; 
  2.   
  3. type Result = 1 | 2 | 3 | 'error' | 'success'; 
  4. type StringResult = Extract<Result, string>;    // 'error' | 'success 

删除 set 的一部门

  1. type Exclude<T, U> = T extends U ? never : T; 
  2. type NumericResult = Exclude<Result, string>;    // 1 | 2 | 3 

获取函数返回值的范例。但要留意不要滥用这个器材范例,应该只管多手动标注函数返回值范例。来由开篇时提过, 左券高于实现 。用 ReturnType 是由实现反推左券,而实现每每轻易变且轻易堕落,左券则相对不变。另一方面,ReturnType 过多也会低落代码可读性。

  1. type ReturnType<T> = T extends (...args: any[]) => infer R ?  R : any; 
  2.   
  3. function f() { return { a: 3, b: 2}; } 
  4. /* 
  5.     a: number 
  6.     b: number 
  7.  */ 
  8. type FReturn = ReturnType<f>; 

以上这些器材范例都已经包括在了 TS 尺度库中,在应用中直接输入名字举办行使即可。其它,在这些器材范例的实现中,呈现了 infer、never、typeof 等要害字,在后文我会具体表明它们的浸染。

范例的递归

TS 原生的 Readonly 只会限定一层写入操纵,我们可以操作递回来实现深条理的 Readonly。但要留意,TS 对最大递归层数做了限定,最多递归 5 层。

  1. type DeepReadony<T> = { 
  2.     readonly [P in keyof T]: DeepReadony<T[P]> 
  3.   
  4. interface SomeObject { 
  5.   a: { 
  6.     b: { 
  7.       c: number; 
  8.     }; 
  9.   }; 
  10.   
  11. const obj: Readonly<SomeObject> = { a: { b: { c: 2 } } }; 
  12. obj.a.b.c = 3;    // TS不会报错 
  13.   
  14. const obj2: DeepReadony<SomeObject> = { a: { b: { c: 2 } } }; 
  15. obj2.a.b.c = 3;    // Cannot assign to 'c' because it is a read-only property. 

never infer typeof 要害字

never 是 | 运算的幺元,即 x | never = x 。譬喻之前的 Exclude<Result, string> 运算进程如下:

TypeScript 中高级应用与美满实践

infer 的浸染是让 TypeScript 本身揣度,并将揣度的功效存储到一个姑且名字中,而且只能用于 extends 语句中。它与泛型的区别在于,泛型是声明一个 “参数”,而 infer 是声明一个 “中间变量”。infer 我用得较量少,这里借用一下官方的示例。

  1. type Unpacked<T> = 
  2.     T extends (infer U)[] ? U : 
  3.     T extends (...args: any[]) => infer U ? U : 
  4.     T extends Promise<infer U> ? U : 
  5.     T; 
  6.   
  7. type T0 = Unpacked<string>;  // string 
  8. type T1 = Unpacked<string[]>;  // string 
  9. type T2 = Unpacked<() => string>;  // string 
  10. type T3 = Unpacked<Promise<string>>;  // string 
  11. type T4 = Unpacked<Promise<string>[]>;  // Promise<string> 
  12. type T5 = Unpacked<Unpacked<Promise<string>[]>>;  // string 

(编辑:湖南网)

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

热点阅读