typescript - 在 TypeScript 中手动 curry 一个 add 函数
问题描述
我正在尝试创建一个可选的类型安全添加函数
const add:
| ((x: number) => (y: number) => number)
| ((x: number, y: number) => number) = (x: number, y?: number) => {
if (y !== undefined) {
return x + y;
} else {
return (y: number) => x + y;
}
};
我希望能够运行此功能
add(1, 5)
或者
add(1)(5)
但目前第二次调用在编译时会引发两个类型错误。错误是
Type '(x: number, y?: number | undefined) => number | ((y: number) => number)' is not assignable to type '((x: number) => (y: number) => number) | ((x: number, y: number) => number)'.
Type '(x: number, y?: number | undefined) => number | ((y: number) => number)' is not assignable to type '(x: number) => (y: number) => number'.
Type 'number | ((y: number) => number)' is not assignable to type '(y: number) => number'.
Type 'number' is not assignable to type '(y: number) => number'.
在函数定义和
Expected 2 arguments, but got 1.
在函数调用时。
我已经看到了返回any
类型的问题的解决方案,但我一直无法找到类型安全的解决方案。我目前想用 TypeScript 做什么?
解决方案
是的,使用函数重载add()
,您可以使用以下签名构造函数:
function add (x: number): (y: number) => number
function add (x: number, y: number): number
function add (x: number, y?: number): number | ((y: number) => number) {
return y === undefined ? (y: number): number => x + y : x + y
}
前两个签名表示有效调用,最后一个签名是包含两个有效调用签名的联合签名。
推荐阅读
- svg - 数据 URI SVG 背景图像不会缩放
- swift - 如何使工作表切换并导航到视图
- c# - 使用混合树和 C# 进行玩家射击
- javascript - 仅使用 ZingChart 显示最近收到的 n 个数据点,而无需重置
- deployment - 您可以将实时前端连接到离线后端吗?
- android - 找不到用户 0 的提供者 com.android.contacts,预计会为此权限找到有效的内容提供者
- javascript - 如何在纯Javascript中获取复选框的标签值
- jetty - Jetty静态资源在列出时不尊重文件权限(具体阅读)
- ios - iOS 14 相机和照片权限流程
- c - C套接字命令打开文件并将输出发送到客户端