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不会把字符串变成数字。 - 类型越多不等于越安全;重复和过宽的标注会掩盖真实关系。
- 推断不是猜测,它依据确定的类型规则和上下文。