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
}