如何为支持柯里化的range函数添加正确的TypeScript返回类型
问题原因
你遇到的TS报错核心原因是:当前TS无法自动识别range函数不同入参对应的返回值类型。你定义的range函数传1个参数时返回函数,传2个参数时返回数字数组,TS会自动把返回值推导为((end: number) => number[]) | number[]联合类型。当你调用range(3)把返回值赋值给start3时,TS不知道这个返回值是函数还是数组,自然不允许你直接把它当函数调用,就会抛出2349错误。
解决方法
用TypeScript的函数重载功能明确标注不同入参对应的返回值类型即可。
你只需要在原函数定义前添加两个重载声明,原有业务逻辑不需要做任何修改:
// 重载1:仅传start时,返回接收end的函数 function range(start: number): (end: number) => number[]; // 重载2:同时传start和end时,返回数字数组 function range(start: number, end: number): number[]; // 原有函数实现 function range(start: number, end?: number) { start = Number(start) || 0; if (end === undefined) { return function getEnd(end: number) { return getRange(start, end); }; } else { end = Number(end) || 0; return getRange(start, end); } function getRange(start: number, end: number) { var ret: number[] = []; for (let i = start; i <= end; i++) { ret.push(i); } return ret; } }
添加重载后TS就可以根据你调用时传的参数数量自动匹配对应的返回值类型:
- 传1个参数调用
range时,TS会识别返回值是可调用的函数,后续调用start3(3)不会报错 - 传2个参数调用
range时,TS会识别返回值是数字数组,可直接调用数组相关方法
内容的提问来源于stack exchange,提问作者lwnash
相关产品推荐
相关产品推荐

