TypeScript 函数参数类型必须显式标注,启用 noImplicitAny 和 strictNullChecks 后未标注类型会报错;可选参数类型自动扩展为 T | undefined;默认参数仍需声明类型;重载签名提升调用时类型精度;函数类型别名保障多处使用的一致性。

TypeScript 为函数参数定义严格类型,核心是显式标注每个参数的类型,并配合 tsconfig.json 中的严格配置(如 noImplicitAny 和 strictNullChecks)来阻止隐式、宽松或不安全的类型行为。它不是靠“写个注解就完事”,而是让编译器能真正校验调用时是否合规。
必须显式标注参数类型
在严格模式下,未标注类型的参数会直接报错(ts(7006)),不能依赖推导或退化为 any:
-
正确写法:每个形参后紧跟冒号和类型,例如
function greet(name: string, age: number): void -
错误写法:省略类型,如
function greet(name, age)—— 启用noImplicitAny后会报错 - 即使参数有默认值,类型仍需声明:
function log(msg: string, level: string = "info"),不能写成level = "info"就省略类型
可选参数与默认参数的类型规则
可选参数(?)和默认参数看似灵活,但类型约束反而更明确:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 可选参数实际类型是
T | undefined(启用strictNullChecks后自动合成),例如id?: number等价于id?: number | undefined - 可选参数必须放在必填参数之后,否则编译报错;例如
function f(a?: string, b: number)是非法的 - 默认参数的类型可由默认值推断,但建议显式写出,增强可读性:
timeout: number = 5000比timeout = 5000更清晰
函数重载签名强化参数约束
当一个函数需支持多种参数组合(比如接收字符串或数组),单靠联合类型容易丢失精度。这时用重载签名可实现“调用即校验”:
立即学习“Java免费学习笔记(深入)”;
- 先写多个函数签名(无函数体),按从具体到宽泛排序
- 最后写一个兼容所有签名的实现(其参数类型通常是联合或 any,但仅用于内部逻辑)
- 编译器根据实参类型自上而下匹配签名,并据此推断返回值类型
- 例如:区分
parse(input: string): number和parse(input: string[]): number[],调用时传字符串就只能得到 number,不会误推成 number[]
用函数类型别名统一约束多处使用
当多个函数接口一致(如都处理用户数据),用类型别名避免重复书写,同时保证一致性:
- 定义:
type UserHandler = (user: User, action: "create" | "update") => boolean - 复用:
const onSave: UserHandler = (u, a) => { ... },若参数类型不符,立刻报错 - 比逐个写
(u: User, a: "create"|"update") => boolean更易维护,也防止某处漏标类型

















