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}`
}