有这几种类型

Boolean

  1. const flag: boolean = false

Number

  1. const flag: number = 1

String

  1. const flag: string = 'string'

Array

  1. const flag: number[] = [1, 2, 3]
  2. const flag: Array<number> = [1, 2, 3] // 泛型语法

Array 是 ts 定义好的泛型。
image.png
typescript 是通过tsconfig lib 来决定读取的是 lib 文件夹下的哪一部分的头文件。
以及 target 如果设置是 es5 的,那么使用 es6 的语法就报错
image.png

元组 Tuple

  1. const flag: [string, number] = ['a', 1]
  2. flag[3] = 'world'; // OK, 字符串可以赋值给(string | number)类型
  3. console.log(flag[5].toString()); // OK, 'string' 和 'number' 都有 toString
  4. flag[6] = true; // Error, 布尔不是(string | number)类型

TODO: 如何使用 数组泛型形式做元组

我想做一个长度为100 的字符串元组,字符串和数字 交叉的元组怎么写
简单的写法可以是这样,github 的 ts issue 里面有人提供了更加健壮的写法

  1. interface FixedLengthArray<T extends any, L extends number> extends Array<T> {
  2. "0": T;
  3. length: L;
  4. }

https://github.com/microsoft/TypeScript/issues/26223

TODO: 字符串和数字 交叉的100个数量的元组怎么写 ?

Enum

  1. enum Flag {
  2. bad, // 0
  3. good, // 1
  4. }
  5. // 结果
  6. "use strict";
  7. var Flag;
  8. (function (Flag) {
  9. Flag[Flag["bad"] = 0] = "bad";
  10. Flag[Flag["good"] = 1] = "good";
  11. })(Flag || (Flag = {}));
  12. enum Flag {
  13. bad = "BAD",
  14. good = "GOOD"
  15. }
  16. // 结果
  17. "use strict";
  18. var Flag;
  19. (function (Flag) {
  20. Flag["bad"] = "BAD";
  21. Flag["good"] = "GOOD";
  22. })(Flag || (Flag = {}));
  23. enum Flag {
  24. bad = "BAD",
  25. good = 1
  26. // 结果
  27. "use strict";
  28. var Flag;
  29. (function (Flag) {
  30. Flag["bad"] = "BAD";
  31. Flag[Flag["good"] = 1] = "good";
  32. })(Flag || (Flag = {}));

通过观察上述生成的 ES5 代码,我们可以发现数字枚举相对字符串枚举多了 “反向映射”:

  1. console.log(Enum.A) //输出:0
  2. console.log(Enum[0]) // 输出:A

TODO: 枚举为什么不支持 布尔值, undefined null 等

  • 是否使用字符串联合类型代替枚举类型更合适 (‘good’ | ‘medium’ | ‘bad’)

定义的枚举,在经过编译器编译后是一个对象。。但有时定义枚举可能只是为了让程序可读性更好,而不需要编译后的代码,即不需要编译成对象。typescript中考虑到这种情况,所以加入了 const enum (完全嵌入的枚举)

  1. enum Status{
  2. Off,
  3. On
  4. }
  5. const enum Animal{
  6. Dog,
  7. Cat
  8. }
  9. const status = Status.On
  10. const animal = Animal.Dog
  11. // 编译后 animal 并没有被创建
  12. var Status;
  13. (function (Status) {
  14. Status[Status["Off"] = 0] = "Off";
  15. Status[Status["On"] = 1] = "On";
  16. })(Status || (Status = {}));
  17. var status = Status.On;
  18. var animal = 0 /* Dog */;

https://cloud.tencent.com/developer/article/1498893

Any

在 TypeScript 中,任何类型都可以被归为 any 类型。这让 any 类型成为了类型系统的顶级类型(也被称作全局超级类型)。
image.png
TODO: 有哪些顶级类型,为什么叫顶级类型
any,number,string,boolean,void,enum,null,undefined,never,unknown,
这些顶级类型也就是基础类型,ts 内部底层做的定义,无法通过编译器再进一步点击去看

https://en.wikipedia.org/wiki/Bottom_type https://en.wikipedia.org/wiki/Top_type

Unknown

和 any 一样是顶级类型

  1. let flag: unknown;
  2. flag = "Hello World"; // OK
  3. flag = true; // OK
  4. flag = 1; // OK
  5. // flag 告诉 ts 不知道它是什么类型,所以赋值给他任何类型都可以,也就是所有的赋值都可以
  1. let flag: unknown;
  2. let flag1: unknown = value; // OK
  3. let flag2: any = value; // OK
  4. let flag3: boolean = value; // Error
  5. let flag4: number = value; // Error
  6. // unknown 类型赋值给 uknown 和any类型可以,但是想赋值给其他类型的不可以。
  7. // 因为unknown 类型可以被赋值其他任何类型

  1. let flag: unknown;
  2. flag.foo.bar; // Error
  3. flag.trim(); // Error
  4. flag(); // Error
  5. // 同样的,ts 也不知道是否有这些属性和方法,所以不能这么操作。

TODO: 和 any 不同,是处于什么目的被设计出来的

Void

void类型像是与any类型相反,它表示没有任何类型。 当一个函数没有返回值时,你通常会见到其返回值类型是 void

  1. function warnUser(): void {
  2. console.log("This is my warning message");
  3. }

声明一个void类型的变量没有什么大用,因为你只能为它赋予undefinednull

  1. let unusable: void = undefined;

Null Undefined

TypeScript里,undefinednull两者各自有自己的类型分别叫做undefinednull。 和 void相似,它们的本身的类型用处不是很大:

  1. // Not much else we can assign to these variables!
  2. let u: undefined = undefined;
  3. let n: null = null;

默认情况下nullundefined是所有类型的子类型。 就是说你可以把 nullundefined赋值给number类型的变量。
然而,当你指定了--strictNullChecks标记,nullundefined只能赋值给void和它们各自。 这能避免 很多常见的问题。 也许在某处你想传入一个 stringnullundefined,你可以使用联合类型string | null | undefined。 再次说明,稍后我们会介绍联合类型。

注意:我们鼓励尽可能地使用--strictNullChecks,但在本手册里我们假设这个标记是关闭的。

Never

never 类型表示的是那些永不存在的值的类型。 例如,never 类型是那些总是会抛出异常或根本就不会有返回值的函数表达式或箭头函数表达式的返回值类型。

  1. // 返回never的函数必须存在无法达到的终点
  2. function error(message: string): never {
  3. throw new Error(message);
  4. }
  5. function infiniteLoop(): never {
  6. while (true) {}
  7. }

TODO: 补充下 never 实际应用

https://www.zhihu.com/question/354601204