TypeScript 类型推断与类型标注

解释 TypeScript 如何从值和控制流推断类型,以及何时应在参数、返回值和公共边界显式标注。

#type / concept #status / evergreen #tech / dev #resource / typescript

[!info] related notes

TypeScript 类型推断与类型标注

一句话定义

类型推断是编译器根据初始值、调用关系和控制流计算类型;类型标注是开发者显式声明一个边界应接受或返回什么。

默认规则

局部实现优先让编译器推断:

const retries = 3;                  // number
const channels = ['run', 'tool'];   // string[]
const active = channels.includes('run'); // boolean

公共边界显式标注意图:

function parseSequence(raw: string): number {
  return Number.parseInt(raw, 10);
}

参数无法从函数体外推断,通常需要标注。返回值经常可以推断,但导出函数、递归函数和安全关键边界适合显式标注,以防实现变化悄悄改变契约。

上下文类型

回调参数常由使用位置提供类型:

const values = ['a', 'b'];
values.map((value) => value.toUpperCase());

这里不需要写 (value: string)。重复标注不会更安全,反而增加噪声。

字面量拓宽

let status = 'running';   // string,因为之后可以重新赋值
const phase = 'running';  // "running"

对象属性默认仍可能拓宽;需要保留字面量时参考 as const、satisfies 与类型断言

决策规则

  • 局部变量:优先推断。
  • 函数参数:通常标注。
  • 导出 API:标注输入,重要时标注返回值。
  • 外部数据:先视为 unknown,运行时校验后再获得业务类型。
  • 不要为了“让红线消失”写 any 或宽泛断言。

常见误解

  • 标注不是运行时转换:const n = value as number 不会把字符串变成数字。
  • 类型越多不等于越安全;重复和过宽的标注会掩盖真实关系。
  • 推断不是猜测,它依据确定的类型规则和上下文。
创建于 2026/7/29 更新于 2026/7/29