为什么TypeScript调用联合类型的函数时会抛出类型错误?
错误出现的根本原因
TypeScript 调用联合类型的函数时,要求传入的参数必须同时满足联合类型所有成员的参数约束,这是因为在调用阶段,编译器无法推导当前fn变量实际存储的是联合类型中的哪一种函数,只会采用最严格的校验规则:
- 你定义的
fn类型是ParameterlessFunction | ParametrizedFunction,其中ParametrizedFunction要求调用时必须传入1个字符串类型的参数 - 你执行
fn()时没有传任何参数,不满足ParametrizedFunction的参数要求,因此触发编译器报错。
赋值阶段没有报错是因为赋值时编译器可以明确识别你赋值的函数的具体类型,只要匹配联合类型的任意一个成员就符合规则,和调用阶段的校验逻辑不同。
常见修复方案
如果要正常调用,可以选择以下两种方案:
- 调用时添加类型断言,明确告知编译器当前
fn的实际类型:
const calledWithoutParameter = (fn as ParameterlessFunction)();
- 调整类型定义,让联合类型的函数参数互相兼容,比如将带参数函数的参数改为可选:
type ParametrizedFunction = (params?: string) => string;
调整后两种调用方式都可以正常通过校验。
内容的提问来源于stack exchange,提问作者Tao Gómez Gil
相关产品推荐
相关产品推荐

