TypeScript中调用函数联合类型为何不触发类型错误?
为什么TypeScript允许给联合类型函数传入多余参数?
给定以下TypeScript代码,higherOrder函数接收F类型(F1与F2的联合类型)的参数f,其中F2类型的函数仅需一个参数,但调用f时传入了两个参数,TypeScript编译器却没有报错,这是为什么?
type F1 = (a: number, b: number) => number; type F2 = (a: number) => number; type F = F1 | F2; const f1: F1 = (a: number, b: number) => a + b; const f2: F2 = (a: number) => 2 * a; const higherOrder = (f: F): number => { return f(2, 3); } const result1 = higherOrder(f1); const result2 = higherOrder(f2); console.log(result1, result2);
这是由TypeScript的联合类型函数调用规则和JavaScript的函数特性共同决定的:
- JavaScript函数特性:JavaScript函数本身允许接收多余参数,多余的参数会被直接忽略,不会触发运行时错误。比如
f2(2, 3)在JS环境中完全合法,函数只会使用第一个参数2。 - TypeScript联合类型函数的调用检查逻辑:当调用联合类型的函数时,TypeScript要求传入的参数必须能被联合类型中的每一个函数成员接受。对于
F2类型的函数(a: number) => number,传入两个number参数是符合要求的——它只校验第一个参数的类型是否正确,第二个参数的存在不会违反类型约束。而F1类型的函数本身就需要两个number参数,自然也满足要求。
因此,传入2和3这两个参数对F联合类型中的两个成员函数都有效,TypeScript编译器不会报错。
内容的提问来源于stack exchange,提问作者Kaspar Poland
相关产品推荐
相关产品推荐

