原始类型

  • string
  • number
  • boolean
  • null
  • undefined
  • symbol
  • bigint

注意

类型名称 String 、NumberBoolean 等(以大写字母开头)是合法的,但指的是一些很少出现在代码中的特殊内置类型(包装类对象)

始终使用 string 、numberboolean 作为类型

非空断言运算符

可以通过非空断言运算符 ! 断言一个变量不是 nullundefined 类型

function liveDangerously(x?: number | null) {
  console.log(x!.toFixed());
}
  • 这只在编译时告诉 TS 变量不为 nullundefined,防止 TS 抱怨
  • 并不影响 JS 代码运行,如果变量为 nullundefined,会报错

数组

  • 元素类型[]:如 number[]
  • Array<元素类型>:使用泛型,如 Array<number>

元组

  • [元素1类型, 元素2类型, ...]:如 [number, string]

函数

function 函数名(形参1: 类型1, 形参2: 类型2): 返回值类型 {
  函数体
}
  • 当函数无返回值(返回值为 undefined),返回值类型使用 void

上下文类型推断

当函数出现在 TypeScript 可以确定如何调用它的位置时,该函数的参数将自动指定类型:

;["Alice", "Bob", "Eve"].forEach(s => { // 可以确定 s 的类型是字符串
  console.log(s.toUpperCase())
})

对象

{
  键1: 类型1,
  键2: 类型2
}
  • 键之间使用 ,;(如果不在一行 ; 可以省略)分割,最后一个键后面的 ,; 可加可不加

可选属性

对象类型还可以指定它们的部分或全部属性是可选的,属性名称后添加一个 ? 即可:

{
  键1: 类型1,
  键2?: 类型2
}

读取时,该值可能为 undefined

其他属性

{
  键1: 类型1,
  键2: 类型2,
  [k: PropertyKey]: 类型
}

枚举

any / unknow

全集,表示任意类型

  • any:任意类型,TS 不检查类型。当值的类型为 any 时,可以访问它的任何属性、像函数一样调用它、将其分配给(或从)任何类型的值
  • unknow:未知类型,TS 完全

never

空集,表示决不可能

联合类型

类型1 | 类型2 | ...

并集

交叉类型

类型1 & 类型2 & ...

交集

字面量类型

let oneOrTwo: 1 | 2 = 1
 
// oneOrTwo 只能是 1 或 2

boolean

实际 TS 的 boolean 类型就是通过字面量类型和联合类型实现的

type boolean = true | false
type PropertyKey = string | number | symbol

as const

const req = { url: "https://example.com", method: "GET" }
// req 的类型是 { url: string, method: string }

可以通过 as const 将类型指定为字面量类型,而不是更通用的类型:

const req = { url: "https://example.com", method: "GET" as const }
// req 的类型是 { url: string, method: "GET" }
 
// 或者作用于整个对象
const req = { url: "https://example.com", method: "GET" } as const
// req 的类型是 { url: "https://example.com", method: "GET" }