2026.01.01

TS 基础

TypeScript 入门指南,掌握强类型静态语言的核心理念

为什么要使用 TypeScript?

优势说明
编译时提前暴露错误在代码运行前就能发现问题
把控代码质量类型系统让代码更规范
解决联调问题明确的接口定义让前后端协作更顺畅

💡 编辑器通常支持 LSP(Language Server Protocol) 语言服务器协议,提供智能提示、错误检查等功能。


TypeScript 的三个核心特性

1. 编译时

  • 浏览器和 Node.js 并不能识别 TypeScript 代码,需要编译为 JavaScript
  • 意味着任何类型错误都会在编译时发现,而不是在运行时

2. 静态类型

  • 类型是在编写代码时指定的,不像 JavaScript 在运行时才确定
  • 这样才能和 IDE 更好地结合,获得更好的代码提示和类型检查

3. 强类型

  • 更严格的类型检查,减少运行时错误

基本类型

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

类型标注

const v1: number = 1

⚠️ 注意:大写形式如 Number 是封装类型(构造函数),小写形式如 number 是原始类型。

一般情况下我们使用小写形式。封装类型在大多数情况下并不推荐使用,除非有特殊需求。


TypeScript 常见类型

字面量类型

限制变量只能取特定的字面量值:

let type: 'hello'

type = 'hello' // ✅ 正确
type = 'test' // ❌ 类型错误

类型拓宽

一般情况下,TS 在进行推导时,会推导出一个宽泛的类型,而不是限定为具体的类型。

let a = 'a' // string
let b = 123 // number
let c = true // boolean

在使用 const 声明不可变的变量时,会自动进行类型收窄

const a = 'a' // 'a'
const b = 123 // 123
const c = true // true

当然也可以通过显式的方式进行定义:

let a: 'a' = 'a' // 'a'
let b: 123 = 123 // 123
let c: true = true // true

💡 但这样的话,对应的值永远无法被重新分配。所以直接使用 const 代替。

使用 const 声明对象时,并不会进行类型收窄:

const obj = {
  a: 123 // number
}

联合类型

使用 | 表示变量可以是多种类型之一:

let direction: 'LEFT' | 'RIGHT' = 'LEFT'
direction = 'RIGHT' // ✅ 正确
direction = 'right' // ❌ 类型错误(大小写敏感)

Interface(接口)

接口是面向对象的概念,用于定义对象的结构——对象应该有哪些属性以及属性的类型:

interface User {
  name: string // 必需属性
  age?: number // 可选属性
  readonly id: string // 只读属性
}

const user: User = {
  name: '张三',
  id: '001'
}

交叉类型

使用 & 将多个类型合并为一起:

interface A {
  id: number
  name: string
}

interface B {
  age: number
}

// 交叉类型:需要同时满足 A 和 B
type C = A & B

const obj: C = {
  id: 1,
  name: '',
  age: 1
}

// 联合类型:满足 A 或 B 即可
type D = A | B

const obj2: D = {
  age: 1
  // id 和 name 是可选的
}

any

在 TS 中,编译时一定要有类型。如果开发时和 TS 检查器都无法确定类型是什么,默认就是 any,是一个兜底的类型。

虽然是兜底的类型,但是类型不兼容的时候 any 一下,不想写的时候 any 一下,此时 TypeScript 就成了令人诟病的 anyScript

💡 最佳实践:尽量避免使用 any,优先使用 unknown 或更具体的类型。

void

在 TS 中,用来描述一个没有 return 语句,或者没有显式 return 的函数:

function fn1() {
} // void
function fn2() { // undefined
  return undefined
}