定义

TypeScript 是一个开源的编程语言,通过在 JavaScript(世界上最常用的语言之一) 的基础上添加静态类型定义构建而成

Typescript 与 JavaScript 的区别

Typescript Javascript
静态语言 动态语言
一种面向对象的编程语言, 需要TypeScript编译器才能转换为JavaScript文件 一种脚本语言, 不需要编译器, 可以在浏览器上运行。
强类型, 支持静态和动态类型 弱类型, 没有静态类型选项
接口,重载等特性 不支持接口,同名函数会被最后定的覆盖

如何使用

  1. npm install -g typescript # 安装
  2. echo hello_world.ts > const gender: string = 'Female'; # 新建ts文件
  3. tsc hello_world.ts # 编译成js

语法

基础类型

  1. // 以下可以不写类型声明,ts可以类型推断
  2. let handsome: boolean = true;
  3. let age: number = 18;
  4. let name: string = 'Rain120;
  5. let travel_cities: string[] = [
  6. 'beijing',
  7. ];
  8. // 使用数组泛型
  9. let travel_cities2: Array<string> = [
  10. 'beijing',
  11. ];
  12. let age: [number, string] = [18, '18']; // Tuple
  13. enum Gender { // enum
  14. FEMALE,
  15. MALE,
  16. }
  17. let value: any; // 不会对他做任何类型检查
  18. let value: unknown; // any 类型对应的安全类型,解决any的问题
  19. let u: undefined = undefined;
  20. let n: null = null;
  21. function warnUser(): void {
  22. console.log("This is my warning message");
  23. }
  24. // 字面量类型
  25. const a = '123'
  26. let b = '123'
  27. let b: 123
  28. // 返回never的函数必须存在无法达到的终点
  29. function error(message: string): never {
  30. throw new Error(message);
  31. }
  32. // 推断的返回值类型为never
  33. function fail() {
  34. return error("Something failed");
  35. }
  36. // 返回never的函数必须存在无法达到的终点
  37. function infiniteLoop(): never {
  38. while (true) {
  39. }
  40. }

高级类型

  1. // 函数
  2. // 函数声明
  3. function getFullName(name?: string = 'test'): string { // 返回值可推断
  4. return `Rainy ${name}`;
  5. }
  6. // 函数表达式
  7. const getFullName: (name: string) => string = function(name: string): string {
  8. return `Rainy ${name}`;
  9. }
  10. // 接口
  11. interface Profile {
  12. readonly name: string;
  13. age?: string | number;
  14. gender: 'MALE' | 'FEMALE';
  15. new (...args: any[]) : Profile
  16. [propName: string]: any;
  17. }
  18. // 交叉类型 交叉类型是将多个类型合并为一个类型。 这让我们可以把现有的多种类型叠加到一起成为一种类型, 它包含了所需的所有类型的特性
  19. interface Boy {
  20. handsome: boolean;
  21. }
  22. interface Girl {
  23. cute: boolean;
  24. }
  25. type Person = Boy & Girl;
  26. const someone: Person = {
  27. handsome: true,
  28. cute: false
  29. };
  30. // 联合类型 联合类型具有 或 关系的多个类型组合而成, 只要满足其中一个类型即可。当你不确定某个对象的值是什么类型时就可以使用 联合类型
  31. interface Boy {
  32. hair: boolean;
  33. tall: boolean;
  34. }
  35. interface Girl {
  36. hair: boolean;
  37. cute: boolean;
  38. }
  39. type Person2 = Boy | Girl
  40. const someone3: Person2 = {
  41. hair: true,
  42. cute: true
  43. }

类型断言

  1. // as 用来手动指定一个值的类型(类型断言 或 类型保护)。换句话来说,就是你比编译器更了解这个变量的类型是什么
  2. const someValue: any = "this is a string";
  3. const strLength: number = (someValue as string).length;
  4. const strLength: number = (<string>someValue).length;
  5. // ! 非空断言 不包含 null 和 undefined的值
  6. const profile: any = {
  7. name: 'Rain120',
  8. schools: {}
  9. }
  10. const getProfile(profile: any) {
  11. console.log(profile!.name, profile!.age, profile!.schools!)
  12. }
  13. const curry = (fn: any) => {
  14. return fn!();
  15. }

进阶

类型保护

  1. // typeof类型保护
  2. function padLeft(value: string, padding: string | number) {
  3. if (typeof padding === "number") {
  4. return Array(padding + 1).join(" ") + value;
  5. }
  6. if (typeof padding === "string") {
  7. return padding + value;
  8. }
  9. throw new Error(`Expected string or number, got '${padding}'.`);
  10. }
  11. interface Padder {
  12. getPaddingString(): string
  13. }
  14. // instanceof 类型保护
  15. class SpaceRepeatingPadder implements Padder {
  16. constructor(private numSpaces: number) { }
  17. getPaddingString() {
  18. return Array(this.numSpaces + 1).join(" ");
  19. }
  20. }
  21. class StringPadder implements Padder {
  22. constructor(private value: string) { }
  23. getPaddingString() {
  24. return this.value;
  25. }
  26. }
  27. function getRandomPadder() {
  28. return Math.random() < 0.5 ?
  29. new SpaceRepeatingPadder(4) :
  30. new StringPadder(" ");
  31. }
  32. // 类型为SpaceRepeatingPadder | StringPadder
  33. let padder: Padder = getRandomPadder();
  34. if (padder instanceof SpaceRepeatingPadder) {
  35. padder; // 类型细化为'SpaceRepeatingPadder'
  36. }
  37. if (padder instanceof StringPadder) {
  38. padder; // 类型细化为'StringPadder'
  39. }
  40. // 用户自定义的类型保护
  41. function isFish(pet: Fish | Bird): pet is Fish {
  42. return (<Fish>pet).swim !== undefined;
  43. }
  44. interface Bird {
  45. fly();
  46. layEggs();
  47. }
  48. interface Fish {
  49. swim();
  50. layEggs();
  51. }
  52. let pet = {
  53. fly() {
  54. console.log(11)
  55. }
  56. }
  57. if (isFish(pet)) {
  58. pet.swim();
  59. }
  60. else {
  61. pet.fly();
  62. }
  63. // 泛型
  64. interface Lengthwise {
  65. length: number;
  66. }
  67. function loggingIdentity<T extends Lengthwise>(arg: T): T {
  68. console.log(arg.length); // Now we know it has a .length property, so no more error
  69. return arg;
  70. }
  71. // 泛型类
  72. class GenericNumber<T> {
  73. zeroValue: T;
  74. add: (x: T, y: T) => T;
  75. }
  76. let myGenericNumber = new GenericNumber<number>();
  77. myGenericNumber.zeroValue = 0;
  78. myGenericNumber.add = function(x, y) { return x + y; };
  79. // keyof
  80. interface T {
  81. a: number;
  82. b: string;
  83. }
  84. type TKeys = keyof T; // "a" | "b"
  85. type PropAType = T['a']; // number
  86. // 索引签名
  87. interface Foo {
  88. [keys: string]: string;
  89. }
  90. // 映射类型
  91. // 将接口下的字段全部变为可选的
  92. type Partial<T> = {
  93. [K in keyof T]?: T[k];
  94. };
  95. // 条件类型
  96. // T extends U ? X : Y
  97. type TypeName<T> = T extends string
  98. ? "string"
  99. : T extends number
  100. ? "number"
  101. : T extends boolean
  102. ? "boolean"
  103. : T extends undefined
  104. ? "undefined"
  105. : T extends Function
  106. ? "function"
  107. : "object";
  108. // infer
  109. // 类型系统在获得足够的信息后,就能将infer后跟随的类型参数推导出来
  110. type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;
  111. // 工具类型
  112. type Required<T> = {
  113. [K in keyof T]-?: T[K];
  114. };
  115. type Readonly<T> = {
  116. readonly [K in keyof T]: T[K];
  117. };
  118. type Exclude<T, U> = T extends U ? never : T;
  119. // K extends keyof any 约束K必须为联合类型
  120. type Record<K extends keyof any, T> = {
  121. [P in K]: T;
  122. };
  123. // 递归类型
  124. type DeepPartial<T> = {
  125. [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
  126. };