TypeScript 类型分析以自上而下的方式工作。这意味着它等于数据也是自上而下传递的程序数据流。 TypeScript 正在分析控制流,但它使用的是从顶部而不是底部给出的信息。
考虑这样的函数示例:
function functionMaker(x: string, y: string) {
return () => x + y;
}
上面的函数返回另一个函数。在返回的匿名函数的定义中没有显式键入,但 TS 能够分析 functionMaker 总是返回 () => string 类型的函数。
换一种方式是不可能的,因为 TS 无法准确预测您将如何处理这些参数。考虑如下:
function functionA(x: string, y: number, z: SpecialType): void { }
function functionB(x: number): void { }
const functionWrapper: (x, y, z) => {
functionA(x, y, z); // x should be string
functionB(x); // x should be number
}
现在 TS 有两个函数都使用一个参数,但是它们都有不同的类型要求。任何解决这个难题的方法都是错误的,因为一个或另一个函数都会失败。
总之 - 类型分析是自上而下进行的。但是我们可以通过创建将包装另一个的通用函数来解决您的问题。
function functionA(x: string, y: number, z: SpecialType): void { }
const wrap = <X, Y, Z, R>(f: (x: X, y: Y, z: Z) => R) => (x: X, y: Y, z: Z): R => f(x,y,z);
const functionWrapper = wrap(functionA);
我们的wrap 被明确定义为一个包装器,这意味着它的目的是从给定函数推断类型并创建另一个具有相同参数和相同返回的函数。