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

抽象掉控制

命令式编程用 forwhile 等控制语句描述「怎么做」;函数式编程用 mapfilterreduce 描述「做什么」,把控制流程交给库函数。

迭代器

迭代器(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

三个核心的高阶操作:

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 让代码更短、更简单、更安全:

在 TypeScript 中避免循环

惯用的 TypeScript 代码优先使用 mapfilter,而不是手写循环。这不仅更简洁,也更不容易出错。

核心要点

一等函数函数是值,可传递、可存储、可动态创建。

生成器yield 逐个产生元素,简洁定义迭代器。

map/filter/reduce抽象控制流程,让代码更简洁、更安全。