number / string / boolean / bigint / symbol
和 JavaScript 中一样
let n: number = 1
let str: string = 'str'
let bool: boolean = true
let bigint: bigint = 123n
let symbol: symbol = Symbol()
null / undefined
它们的行为取决于配置项 strictNullChecks
:
- 关闭:如果一个值可能是 null 或者 undefined,它依然可以被正确的访问,或者被赋值给任意类型的属性
- 开启(推荐):如果一个值可能是 null 或者 undefined,需要在用它的方法或者属性之前,先检查这些值,就像用可选的属性之前一样
object
表示任何非原始数据类型
字面量类型(Literal Types)
具体到某个字面值的类型,可以是 字符串、数字、布尔值(可以和联合类型相结合使用)
使用 let 或 var 声明的变量类型自动推导为其数据类型,而 const 会推导为字面量类型:
let a = 'hello world' // a: string
const b = 'hello world' // b: 'hello world'
any
任意类型,不会进行类型检查,基本不用
声明一个变量为任意值之后,对它的任何操作,返回的内容的类型都是任意值
开启配置项 noImplicitAny
避免隐式赋值为 any 类型
unknown
any 赋值给其他变量时会污染其他变量,所以引入 unknow 类型,对 unknown 类型的值做任何事情都是不合法的,可以看作是更安全的 any
要对 unknown 进行操作,必须先进行 类型收窄(Narrowing)
never
表示空集,任何类型都不能赋值给 never(除了它自身)
用处:
- 在分支处理中作为兜底,后续变量变化时如果分支中不处理就会报错,从而发现隐藏错误
- 函数内部异常报错,没有返回值
- 在条件运算中表示空,丢弃
联合类型(Union Types)
表示取值可以为多种类型中的一种,使用
|
分隔每个类型
访问联合类型共有的属性或方法是可以的,否则需要在使用前先判断类型
function myfunc(id: string | number): string {
return `hello world, ${id}`
}
// 下面都可以
myfunc("123456")
myfunc(123456)
类型别名(Type Aliases)
如果多次使用同一个类型,可以通过一个别名来引用,别名不允许重名
type Person = {
name: string
age: number
}
function myfunc(obj: Person): string {
return `hello world, ${obj.name}: ${obj.age}`
}