开篇前言

直接看英文官方文档最靠谱,更新最及时,我搜出来的中文文档,要么不确定内容是否过时,要么翻译官方英文文档中的例子时,存在遗漏了关键描述的情况(比如介绍在泛型约束中使用类型参数时的那个例子),没错我说的是这个翻译地址:

https://www.tslang.cn/docs/handbook/generics.html

相对的,下面这个中文地址就比较靠谱,一直在更新:

https://typescript.bootcss.com/generics.html

一方面文档字太多,另一方面为了边学习文档边写点自己的理解,所以有了我写的这个随笔。毕竟学过的东西,尝试总结述说出来会加深理解,且需要的时候,能快速找回记忆。

即使不打算使用 TS 开发项目,了解一下 TS 基本语法还是非常有价值,收益立竿见影(比余额宝要快)。因为目前项目中依赖了不少第三方库,比如 react、ant design、axios 等,他们都提供了类型声明文件,这使得平时在调用它们的 API 时,可以很好地借助编辑器查看 API 的接口定义,有时候比再去官网翻文档更快更准确,因为你看到的定义正是来自于当前项目中正在使用的版本。


基础类型

  • Boolean
  • Number
  • String
  • Array
  • Tuple
  • Enum
  • Any
  • Void
  • Null and Undefined
  • Never

Boolean、String、Number 和原生一样,参见下方。

  1. // Number 类型
  2. let decimal: number = 6
  3. let hex: number = 0xf00d
  4. let binary: number = 0b1010
  5. let octal: number = 0o744
  6. // Array 类型 有两种使用方法
  7. let list: number[] = [1, 2, 3]
  8. let list: Array<number> = [1, 2, 3]
  9. // Tuple 元组类型 可以用固定数量的元素表示一个数组且元素类型不一定相同
  10. // 注意!自从 TypeScript 3.1 版本及之后,Tuple 类型不能再访问越界元素
  11. let x: [string, number]
  12. x = ['hello', 20]
  13. // Enum 枚举类型 可以为一组数值赋予对应的名字
  14. enum Color {
  15. Red,
  16. Green,
  17. Blue
  18. }
  19. let c: Color = Color.Blue
  20. let colorName: string = Color[2]
  21. console.log(colorName, Color.Red)
  22. console.log(Color)
  23. // Any 类型 表示任何类型
  24. // TS 中会自动类型推断,即使不指定类型
  25. let notSure: any = 4
  26. notSure = 'maybe a string instead'
  27. notSure = false
  28. let list: any[] = [1, true, 'free']
  29. list[1] = 100
  30. // void 和 any 相反,表示没有任何类型
  31. // 比如用来表示函数没有返回值
  32. function warnUser(): void {
  33. console.log('This is my warning message')
  34. }
  35. // 声明一个 void 类型的变量是没有意义的
  36. // void 类型只能使用 undefined 或 null 赋值
  37. let unusable: void = undefined
  38. // null 类型和 undefined 类型
  39. // 在 TS 中,null 是 undefined 的父类型,
  40. // 所以 undefined 可以赋值给 null
  41. let u: undefined = undefined
  42. let n: null = undefined
  43. // 用 null 赋值给其他类型,默编译通过不报错
  44. // 但如果编译时开启检测 --strictNullChecks
  45. let num: number = 3
  46. num = null
  47. // 开启检测后能规避很多潜在问题,但如果就是想给 num 赋值为 null,
  48. // 可以使用联合类型
  49. let num2: number | null = 3
  50. num2 = null
  51. // never 类型,表示永远不存在的数据类型,
  52. // never 是任何类型的子类型可以赋值给任何类型,但不能被任何类型赋值,包括 any
  53. // never 使用场景1
  54. function error(message: string): never {
  55. throw new Error(message) // 不能有到达的终点
  56. }
  57. function fail() {
  58. return error('something faild')
  59. }
  60. // never 使用场景2
  61. function infiniteLoop(): never {
  62. while (true) { // 不能有到达的终点
  63. // ...
  64. }
  65. }
  66. // object 类型,是一个比较泛的类型,不能被赋值为简单类型 Object.create
  67. // 只能传入 Object 或者是 null
  68. // 下面的方法声明,类似于原生的 Object.create() 方法
  69. declare function create(o: object | null): void;
  70. create(42) // 不行
  71. create('string') // 不行
  72. create(false) // 不行
  73. create({ prop: 0 })
  74. create([1, 2, 3])
  75. create(null)
  76. create(undefined)
  77. create(null)
  78. // 类型断言,有时候你比 TS 更知道会是什么类型,所以可以强制将类型进行转换
  79. let someValue: any = 'this is a string'
  80. // 定义为 any 后,敲下面代码时,是不会自动提示存在 length 属性的
  81. someValue.length
  82. // 强制把 someValue 转换为 string 类型
  83. // 此时用点操作符准备写 length 这个词的时候,编辑器就会有提示
  84. let strLength1: number = (<string>someValue).length
  85. // 下面这种写法更推荐一些
  86. let strLength2: number = (someValue as string).length