CLASS 10 · 2026-03-09 · 类型与函数式
函数式编程
函数式编程用不可变数据和纯函数建模问题。本讲学习一等函数、迭代器、生成器,以及 map/filter/reduce 如何抽象掉显式控制流程,让代码更简洁、更安全。
一等函数
一等函数(First-class functions):函数可以作为数据值——存入变量、作为参数传递、动态创建。
在 TypeScript 中,函数是一等公民。我们可以把函数像普通值一样传来传去,这为「抽象控制流程」打开了大门。
函数表达式
TypeScript 提供两种定义匿名函数的方式:function 表达式和箭头函数。
// function 表达式
const add = function(a: number, b: number): number {
return a + b;
};
// 箭头函数(更简洁)
const add2 = (a: number, b: number): number => a + b;
// 函数作为参数
function applyTwice(x: number, f: (n: number) => number): number {
return f(f(x));
}
console.log(applyTwice(3, n => n * 2)); // 12
抽象掉控制
命令式编程用 for、while 等控制语句描述「怎么做」;函数式编程用 map、filter、reduce 描述「做什么」,把控制流程交给库函数。
迭代器
迭代器(Iterator):一个对象,它逐步遍历序列中的元素,每次返回一个。
迭代器提供统一的遍历接口,隐藏底层数据结构的差异。
生成器函数
TypeScript/JavaScript 的生成器(Generator)用 yield 逐个产生元素,是定义迭代器的简洁方式:
// 生成器:产生冰雹数列
function* hailstone(n: number): Generator<number> {
let current = n;
while (current !== 1) {
yield current;
if (current % 2 === 0) {
current = current / 2;
} else {
current = 3 * current + 1;
}
}
yield 1;
}
// 使用生成器
for (const x of hailstone(10)) {
console.log(x); // 10, 5, 16, 8, 4, 2, 1
}
Map / Filter / Reduce
三个核心的高阶操作:
- Map:对每个元素应用一元函数,返回等长的新序列。
- Filter:用谓词测试每个元素,保留满足条件的。
- Reduce:用二元函数把序列归约为单个值。
const nums = [1, 2, 3, 4, 5, 6];
// map:每个元素乘 2
const doubled = nums.map(n => n * 2);
// [2, 4, 6, 8, 10, 12]
// filter:保留偶数
const evens = nums.filter(n => n % 2 === 0);
// [2, 4, 6]
// reduce:求和
const sum = nums.reduce((acc, n) => acc + n, 0);
// 21
// 链式组合:偶数的平方和
const result = nums
.filter(n => n % 2 === 0)
.map(n => n * n)
.reduce((acc, n) => acc + n, 0);
// 4 + 16 + 36 = 56
抽象控制的好处
Map/filter/reduce 让代码更短、更简单、更安全:
- 消除手动索引和边界错误。
- 意图更清晰——「过滤偶数」比「for 循环 + if 判断」更直接。
- 天然适合不可变数据——每次操作都返回新序列,不修改原数据。
在 TypeScript 中避免循环
惯用的 TypeScript 代码优先使用 map 和 filter,而不是手写循环。这不仅更简洁,也更不容易出错。
核心要点
一等函数函数是值,可传递、可存储、可动态创建。
生成器用 yield 逐个产生元素,简洁定义迭代器。
map/filter/reduce抽象控制流程,让代码更简洁、更安全。