以下是TypeScript(TS)的核心重点知识梳理,从基础到进阶,覆盖日常开发的核心场景:
一、TypeScript 基础认知
TypeScript 是 JavaScript 的超集,在 JS 基础上增加了静态类型系统,核心价值是:
- 类型安全:编译时发现类型错误,减少运行时 Bug。
- IDE 智能提示:提升开发效率和代码可维护性。
- 渐进式 adoption:可与 JS 共存,逐步迁移。
二、核心:类型系统
1. 基础类型
| 类型 |
说明 |
示例 |
string |
字符串 |
let name: string = 'TS' |
number |
数字(整数/浮点数) |
let age: number = 25 |
boolean |
布尔值 |
let isOk: boolean = true |
null/undefined |
空值/未定义(默认是所有类型的子类型) |
let n: null = null |
symbol/bigint |
唯一值/大整数(ES6+) |
let s: symbol = Symbol() |
any |
任意类型(慎用,失去类型安全) |
let val: any = 123 |
unknown |
未知类型(比 any 安全,需类型断言) |
let val: unknown = 'hi' |
void |
无返回值(函数常用) |
function log(): void { } |
never |
永不存在的值(如抛出错误/死循环) |
function err(): never { throw new Error() } |
重点区分:any vs unknown
any:完全绕过类型检查,赋值给任何变量都不报错(不推荐)。
unknown:类型安全的“任意类型”,需类型断言或类型守卫后才能使用。
2. 复合类型
(1)数组类型
1 2 3
| let arr1: number[] = [1, 2, 3] let arr2: Array<string> = ['a', 'b']
|
(2)元组(Tuple)
固定长度、固定类型的数组:
1 2
| let tuple: [string, number] = ['TS', 10] tuple[0]
|
(3)枚举(Enum)
定义一组命名常量:
1 2 3 4 5 6 7 8 9 10 11 12 13
| enum Status { Pending, Success, Failed } let s: Status = Status.Success
enum Color { Red = 'red', Blue = 'blue' }
|
3. 接口(Interface)
定义对象的结构,是 TS 最核心的类型约束方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| interface User { id: number; name: string; age?: number; readonly email: string; }
interface AddFn { (a: number, b: number): number; } const add: AddFn = (a, b) => a + b
interface Dict { [key: string]: string; } const dict: Dict = { name: 'TS', version: '5.0' }
interface Admin extends User { role: string; }
|
4. 类型别名(Type Aliases)
给类型起别名,可定义更复杂的类型(联合、交叉等):
1 2 3 4 5 6 7 8 9 10 11 12
| type ID = number | string
type Status = 'pending' | 'success' | 'failed'
type Person = { name: string } & { age: number }
|
三、函数类型
TS 对函数的参数、返回值都可做类型约束:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| function greet(name: string): string { return `Hello ${name}` }
function log(msg: string, level?: string): void { console.log(level || 'info', msg) }
function sum(...nums: number[]): number { return nums.reduce((a, b) => a + b, 0) }
function add(a: number, b: number): number; function add(a: string, b: string): string; function add(a: any, b: any): any { return a + b }
|
四、类(Class)
TS 增强了 JS 类的面向对象能力,支持访问修饰符、抽象类等:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| class Animal { private name: string; protected age: number;
constructor(name: string, age: number) { this.name = name; this.age = age; }
public speak(): void { console.log(`${this.name} makes noise`); } }
class Dog extends Animal { private breed: string;
constructor(name: string, age: number, breed: string) { super(name, age); this.breed = breed; }
public speak(): void { console.log(`${this.name} barks`); } }
abstract class Shape { abstract getArea(): number; } class Circle extends Shape { getArea() { return Math.PI * 10 * 10; } }
|
五、泛型(Generics)
实现类型复用,让类型像参数一样传递,是 TS 高级特性的核心:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| function identity<T>(value: T): T { return value; } identity<string>('TS') identity(123)
interface Box<T> { value: T; } const box: Box<number> = { value: 100 }
interface Lengthwise { length: number; } function logLength<T extends Lengthwise>(value: T): void { console.log(value.length); } logLength('TS') logLength([1,2,3])
|
六、高级类型工具
TS 内置了大量工具类型,用于快速转换类型(日常开发高频使用):
| 工具类型 |
作用 |
示例 |
Partial<T> |
所有属性变为可选 |
Partial<User> |
Required<T> |
所有属性变为必选 |
Required<User> |
Readonly<T> |
所有属性变为只读 |
Readonly<User> |
Pick<T, K> |
从 T 中选取部分属性 K |
`Pick<User, ‘id’ |
Omit<T, K> |
从 T 中排除部分属性 K |
Omit<User, 'email'> |
Record<K, T> |
定义 key 为 K、value 为 T 的对象 |
Record<string, number> |
Exclude<T, U> |
从 T 中排除属于 U 的类型 |
`Exclude<’a’ |
Extract<T, U> |
从 T 中提取属于 U 的类型 |
`Extract<’a’ |
ReturnType<T> |
获取函数返回值类型 |
ReturnType<typeof add> |
示例:
1 2 3 4 5 6 7 8 9
| interface User { id: number; name: string; email: string; }
type UserPreview = Omit<User, 'email'>;
|
七、类型断言与守卫
1. 类型断言
告诉编译器“我比你更清楚类型”,有两种写法:
1 2 3 4 5
| let val: unknown = 'TS'
let len: number = (val as string).length
let len2: number = (<string>val).length
|
2. 类型守卫
在运行时判断类型,让编译器自动缩小类型范围:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| function isString(val: unknown): val is string { return typeof val === 'string' }
function isDog(animal: Animal): animal is Dog { return animal instanceof Dog }
function hasName(obj: any): obj is { name: string } { return 'name' in obj }
|
八、模块与声明文件
1. 模块系统
TS 支持 ES 模块(import/export),与 JS 一致:
1 2 3 4 5 6
| export const name = 'TS' export function add(a: number, b: number) { return a + b }
import { name, add } from './utils'
|
2. 声明文件(.d.ts)
为第三方 JS 库提供类型支持(如 lodash、jquery):
1 2 3 4 5
| declare var $: (selector: string) => any;
|
九、配置文件:tsconfig.json
TS 项目的核心配置文件,控制编译行为:
1 2 3 4 5 6 7 8 9 10 11 12 13
| { "compilerOptions": { "target": "ES6", "module": "ESNext", "strict": true, "esModuleInterop": true, "outDir": "./dist", "rootDir": "./src", "skipLibCheck": true }, "include": ["src/**/*"], "exclude": ["node_modules"] }
|
十、最佳实践
- **尽量避免
any**:优先用 unknown,配合类型断言/守卫。
- 开启严格模式:
tsconfig.json 中 "strict": true,强制类型安全。
- 合理使用工具类型:用
Partial、Pick、Omit 等简化类型定义。
- 类型推断优先:TS 能自动推断的类型,无需显式声明(如
let name = 'TS' 不用写 : string)。
- 为第三方库安装类型声明:如
@types/lodash,避免类型缺失。
总结
TS 的核心是“类型安全 + 渐进式”,重点掌握:
- 基础类型、接口、类型别名(构建类型系统的基础)。
- 泛型、工具类型(实现类型复用的关键)。
- 类型断言、守卫(处理复杂类型场景)。
- 严格模式 + 合理配置(最大化 TS 价值)。
通过这些知识,可大幅提升代码的可维护性和可靠性,减少运行时错误。