一、基本类型
- 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
- 大写类型同时包含包装对象和字面量两种情况,小写类型只包含字面量,不包含包装对象。
- 建议只使用小写类型,不使用大写类型,因为绝大部分使用原始类型的场合,都是使用字面量,不使用包装对象。而且,TypeScript 把很多内置方法的参数,定义成小写类型,使用大写类型会报错。
三、Object和object
- 几乎所有的类型都可以赋值给Object类型,除了null undefined never等,范围太广泛,一般不使用
- 小写的object类型只包含对象、数组、函数,不包括原始类型的值
- 建议总是使用object,不使用Object
- 无论Object或者object,都只包含js内置的属性和方法,不包含用户自定义的属性和方法
四、值类型
- TypeScript 推断类型时,遇到const命令声明的变量,如果代码里面没有注明类型,就会推断该变量是值类型。
- 因为const命令声明的变量,一旦声明就不能改变,相当于常量
- 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教程