资讯专栏INFORMATION COLUMN

typescript高级类型部分代码记录

jsummer / 1052人阅读

摘要:都支持嵌套写法写法写法有趣的写法常量的写法与交叉数据类型用法获取对象的属性升级版用法这种的联合类型可以使用来循环值只能为用法二和与字符串索引签名进行交互。

interface type 都支持嵌套写法

</>复制代码

  1. // interface 写法
  2. interface Ip {
  3. name: string;
  4. child?: Ip;
  5. }
  6. let child: Ip = {
  7. name: "str",
  8. child: {
  9. name: "test"
  10. }
  11. };
  12. // type 写法
  13. type Ip = {
  14. name: string;
  15. child?: Ip;
  16. };
  17. let child: Ip = {
  18. name: "child",
  19. child: {
  20. name: "haha"
  21. }
  22. };
  23. // 有趣的写法
  24. type LinkedList = T & { next: LinkedList }; // people = {name:"",next:{name:"",next:{...}}}
  25. interface Person {
  26. name: string;
  27. }
  28. var people: LinkedList;
  29. var s = people.name;
  30. var s = people.next.name;
  31. var s = people.next.next.name;
  32. var s = people.next.next.next.name;

常量的写法 与 交叉数据类型

</>复制代码

  1. interface I {
  2. name: "ccc";
  3. }
  4. interface P {
  5. age: "bbb";
  6. }
  7. var a: I & P = {
  8. name: "ccc",
  9. age: "bbb"
  10. };

keyof 用法

</>复制代码

  1. // 获取对象的属性
  2. function pluck(o: T, names: K): T[K] {
  3. return o[names];
  4. }
  5. // 升级版
  6. function pluck1(o: T, names: K[]): T[K][] {
  7. return names.map(item => o[item]);
  8. }
  9. // keyof用法
  10. interface Personal {
  11. name: string;
  12. age: number;
  13. }
  14. //keyof Personal ==> "name" | "age" 这种的联合类型 可以使用in来循环
  15. let ppp: keyof Personal = "name";
  16. let ppp1: keyof Personal = "age";
  17. let ppp2: keyof Personal = "ss"; // error 值只能为 name | age

keyof 用法二
keyof 和 T[K]与字符串索引签名进行交互。 如果你有一个带有字符串索引签名的类型,那么 keyof T 会是 string。 并且 T[string]为索引签名的类型

</>复制代码

  1. interface Map1 {
  2. [key: number]: T;
  3. }
  4. let pp: keyof Map1; // pp 类型为number
  5. let pp4: Map1[0]; // 返回的类型是string
  6. interface Map2 {
  7. [key: string]: T;
  8. }
  9. let pp1: keyof Map1; // pp1 类型为string
  10. let pp3: Map2["foo"]; // 返回的类型是number

keyof 用法 3 映射类型

</>复制代码

  1. // 通过这个类型生成一个只读版本 in 内部使用了for---in循环
  2. interface PersonPartial {
  3. name?: string;
  4. age?: number;
  5. }
  6. // 使用
  7. type ReadonlyPersonPartial = {
  8. readonly [key in keyof PersonPartial]: PersonPartial[key]
  9. }
  10. let b: ReadonlyPersonPartial = {
  11. name: "string",
  12. age: 123
  13. }
  14. type Map2 = {
  15. [key in keyof PersonPartial]?: T;
  16. }
  17. var a: Map2 = {
  18. name: "123",
  19. }
  20. // 封装一些通用的版本
  21. type BeNull = {
  22. [P in keyof T]:T[P] | null
  23. }
  24. type BeEmpty = {
  25. [P in keyof T]?:T[P]
  26. }

理解 extends in 相关的东西

</>复制代码

  1. interface a {
  2. name: string;
  3. age: number;
  4. }
  5. // T 相当于上面有 name | age
  6. // [key in T] 循环 name age ,每一个key就是name age 那么 a[name],a[age] j
  7. type b = { [key in T]: a[key] };
  8. let c: b<"name" | "age"> = {
  9. name: "123",
  10. age: 12
  11. };

内置的 pick record exclude的理解 慢慢来吧

</>复制代码

  1. // pick 的作用是传入一个接口,返回接口里面特定的字段类型
  2. type Pick = {
  3. [P in K]: T[P];
  4. };
  5. interface b {
  6. name: string,
  7. age:number
  8. }
  9. let cc: Pick = {
  10. name: "cc",
  11. age:123
  12. }
  13. // 传入属性,生成一个接口 生成一个 name age 都是string的interface
  14. type Record = {
  15. [P in K]: T;
  16. };
  17. let mmm: Record<"name" | "age", string> = {
  18. name: "ccc",
  19. age:"20"
  20. }
  21. // 排除相同的 extends 可以理解为 T 可以赋值给 U 可以赋值返回never 否则 返回 T
  22. type Exclude = T extends U ? never : T;
  23. interface a {
  24. name:string
  25. }
  26. interface b {
  27. name: string,
  28. age:number
  29. }
  30. interface c {
  31. name: string,
  32. age: number,
  33. hobby:any
  34. }
  35. // 这两个东西表示出来了 是分开来搞的 首先 a extends b => a b extends b=>never 所以返回的是 a
  36. let nnn: Exclude // 返回 a
  37. let nnnn: Exclude // 返回 never a extends a => never b extends a b可以赋值给a 返回never
  38. let ccc: Exclude
  39. let b: a extends b ? number : string // a 不能赋值给 b 所以返回了string b的类型就是string
  40. let nnn:Exclude // 排除相同的过后 剩下的就是 ‘age’ "name"|"age" extends "name" 难道是 name extends name , age extends name 分开来的 先这样理解吧
  41. type mm = "number" | "age";
  42. type nn = "age"
  43. let c: mm extends nn ? never : mm; // mm 不能赋值给 nn 所以返回值是 mm 并不是上面Exclude 返回的 age 这个可以理解为传入泛型变量的时候ts 帮我们去循环 extends(赋值了一下)
  44. // 取出相同的
  45. type Extract = T extends U ? T : never; // T 可以赋值给 U的话 表示的是T中的字段 U中肯定都存在 返回了 U。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/104445.html

相关文章

  • 【速查手册】TypeScript 高级类型 cheat sheet

    摘要:官方文档高级类型优先阅读,建议阅读英文文档。关键字这个关键字是在版本引入的在条件类型语句中,该关键字用于替代手动获取类型。源码解释使用条件判断完成示例官方作用该类型可以获得函数的参数类型组成的元组类型。 学习 TypeScript 到一定阶段,必须要学会高阶类型的使用,否则一些复杂的场景若是用 any 类型来处理的话,也就失去了 TS 类型检查的意义。 本文罗列了 TypeScript...

    LoftySoul 评论0 收藏0
  • 为vue3学点typescript, 解读高级类型

    摘要:直达第一课体验第二课基础类型和入门高级类型第三课泛型第四课解读高级类型第五课什么是命名空间回顾第二课的时候为了更好的讲解基础类型所以我们讲解了一部分高级类型比如接口联合类型交叉类型本节课我会把剩余高级类型都讲完知识点摘要本节课主要关键词为自 直达 第一课, 体验typescript 第二课, 基础类型和入门高级类型 第三课, 泛型 第四课, 解读高级类型 第五课, 什么是命名空间(na...

    chuyao 评论0 收藏0
  • 为vue3学点typescript, 基础类型和入门高级类型

    摘要:导航第一课体验第二课基础类型和入门高级类型第三课泛型第四课解读高级类型很重要这一节很重要可以说是的最核心部分这一节学完其实就可以开始用写代码了想想中的再看看标题中的类型字所以请大家务必认真什么是入门高级类型因为高级类型的内容比较多但是有些基 导航 第一课, 体验typescript 第二课, 基础类型和入门高级类型 第三课, 泛型 第四课, 解读高级类型 很重要 这一节很重要, 可以说...

    Songlcy 评论0 收藏0
  • typescript 高级技巧

    摘要:会报错,因为中没有暴露此方法,可以最大限度的避免拼写错误在此之前,先看一个的错误处理流程,以下是对进行集中处理,并且标识的过程在处,会编译出错,提示。 用了一段时间的 typescript 之后,深感中大型项目中 typescript 的必要性,它能够提前在编译期避免许多 bug,如很恶心的拼写问题。而越来越多的 package 也开始使用 ts,学习 ts 已是势在必行。 以下是我在...

    venmos 评论0 收藏0
  • SegmentFault 技术周刊 Vol.40 - 2018,来学习一门新的编程语言吧!

    摘要:入门,第一个这是一门很新的语言,年前后正式公布,算起来是比较年轻的编程语言了,更重要的是它是面向程序员的函数式编程语言,它的代码运行在之上。它通过编辑类工具,带来了先进的编辑体验,增强了语言服务。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不觉已经到来了,总结过去的 2017,相信小伙们一定有很多收获...

    caspar 评论0 收藏0

发表评论

0条评论

jsummer

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<