contextual 上下文类型

最后更新:2026-10-22

contextual 上下文类型

上下文类型:当函数字面量出现在"已知类型的位置"(变量注解、数组方法回调、事件处理器),TS 会反推它的参数类型——无需手写注解。map((o) => o.id) 里的 o 之所以有类型,不是推断自函数本身,而是来自数组元素类型这个"上下文"。

分组函数与类
类型语法
严格模式不需要

ℹ️ 说明 编辑器将 TypeScript 转译为 JavaScript 后运行(不做类型检查);类型检查结果见示例 Output。

📝 语法

const orders: Order[] = [];

// 回调参数 o 从 orders 的元素类型获得上下文类型 Order
const summaries = orders.map((o) => `#${o.id}: ${o.total}`);

// 变量注解同样提供上下文
type ClickHandler = (event: { x: number; y: number }) => void;
const onClick: ClickHandler = (event) => console.log(event.x, event.y);

⚙️ 参数

const x: T = ...触发上下文推断的场景:变量/参数的类型注解、数组元素、函数实参(对应形参类型)、return 表达式(对着声明的返回类型)
(x) => ...无注解时由上下文提供类型;写注解则必须与上下文兼容,否则报错

返回值:return 表达式同样受上下文约束:声明的返回类型会反向检查每个 return,提前抓住"少 return 一个分支"这类错误。

▶ 示例

修改下面的代码,点击试一试查看转译运行结果:

输出:

#101: 250, #102: 90, #103: 480
2
click @ 12,34

(转译后运行输出;在回调里写 o.pric(拼错的属性名)会立即得到编译错误——上下文类型不允许)

💡 要点

ℹ️ 说明 上下文推断是"从外向内"的类型流动,与普通推断(从表达式向变量)方向相反;两者同时存在时,有明确注解的一方胜出。
💡 提示 回调参数旁标红"隐式 any"通常说明上下文缺失(数组没标类型)——先修外层类型,而不是给回调加注解。
⚠️ 注意 React 的 onChange={(e) => ...} 之类回调依赖上下文类型;用 useCallback 包裹后单独提取时,类型注解要自己补上,否则参数退化为 any。
更多案例即将上线。

❓ 常见问题

Q 上下文类型和类型推断是一回事吗?
A 不是。普通推断"从值到类型"(const x = 5 → number);上下文类型"从位置到值"——先知道目标类型,再反推函数字面量参数。回调参数的类型几乎都来自后者。
Q 为什么我的 map 回调参数是 any?
A 数组本身没有类型(如来自 JSON.parse 或漏了注解),上下文无从提供,回调参数就成了隐式 any;给数组标注元素类型即可修复。
Q 上下文类型可以"放过"错误吗?
A 恰恰相反——它是检查的依据。回调里访问上下文类型没有的属性会立刻报错(多写一个字段也不行),这正是它能防止拼错属性名的原因。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏