在以下示例中:
function functionA(x: string, y: number, z: SpecialType): void { }
const functionWrapper: (x, y, z) => functionA(x, y, z);
functionWrapper的参数键入为any
。有什么方法可以鼓励tsc从其用法中推断出其类型?TypeScript类型系统的哪些限制阻止了此问题的解决?
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
被明确定义为包装器,这意味着其目的是从给定函数中推断类型并创建另一个具有相同参数和相同返回值的函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句