TypeScript_类型系统

93 阅读2分钟

一、基本类型

  • boolean
  • string
  • number
  • bigint:与Number类型不兼容,ES2020标准引入
  • symbol:Symbol()函数返回的值
  • object:包含所有对象、数组和函数
  • undefined:只包含一个值undefined,即是值也是类型
  • null:只包含一个值null,即是值也是类型
    注:没有声明类型的变量被赋值为undefined和null,在关闭编译设置noImplicitAny和strictNullChecks时,它们的类型会被推断为any,如果希望避免这种情况,需要打开编译选项strictNullChecks。

二、包装对象类型和字面量类型

  • Boolean boolean
  • String string
  • Number number
  • BigInt bigint
  • Symbol symbol
  1. 大写类型同时包含包装对象和字面量两种情况,小写类型只包含字面量,不包含包装对象。
  2. 建议只使用小写类型,不使用大写类型,因为绝大部分使用原始类型的场合,都是使用字面量,不使用包装对象。而且,TypeScript 把很多内置方法的参数,定义成小写类型,使用大写类型会报错。

三、Object和object

  1. 几乎所有的类型都可以赋值给Object类型,除了null undefined never等,范围太广泛,一般不使用
  2. 小写的object类型只包含对象、数组、函数,不包括原始类型的值
  3. 建议总是使用object,不使用Object
  4. 无论Object或者object,都只包含js内置的属性和方法,不包含用户自定义的属性和方法

四、值类型

  1. TypeScript 推断类型时,遇到const命令声明的变量,如果代码里面没有注明类型,就会推断该变量是值类型。
  2. 因为const命令声明的变量,一旦声明就不能改变,相当于常量
  3. const变量赋值为对象时,属性值是可以改变的

五、联合类型

let c1: string | number = 123

注:使用联合类型时,需要进行类型收窄

六、交叉类型

type A = {
  foo: number
}
type B = A & {
  bar: string
}

let c3: { foo: string } & { bar: number }
c3 = {
  foo: '123',
  bar: 123,
}

注:交叉类型常常用来为对象类型添加新属性

七、type

type Age = number
let age: Age = 30
  • 别名可以让类型的名字变得更有意义,也能增加代码的可读性,还可以使复杂类型用起来更方便,便于以后修改变量的类型
  • 别名不允许重名
  • 别名的作用域是块级作用域,代码块内部定义的别名不会影响到外部定义的别名

八、typeof

typeof undefined // "undefined"
typeof true // "boolean"
typeof 1337 // "number"
typeof 'foo' // "string"
typeof {} // "object"
typeof parseInt // "function"
typeof Symbol() // "symbol"
typeof 127n // "bigint"

参考:
阮一峰TypeScript教程