javascript - 使用绑定时的Typescript Promise curry函数
问题描述
我有这段代码使用从 node:net 输入的服务器。
我正在尝试为 curry 函数设置正确的类型。
const originalClose = server.close.bind(server) as Server['close']; // node:net Server typing
server.close = () => new Promise((resolveClose) => {
originalClose(resolveClose);
});
目前,我收到此打字稿错误:
Type 'Promise<unknown>' is missing the following properties from type 'Server': listen, close, address, getConnections, and 20 more.ts(2740)
我尝试过使用Promise<Server>
as well,Promise<Server['close']>
但实际上我意识到我将 resolve(?) case 包装在有界originalClose
const 中。
我的问题是我怎样才能在这里得到正确的输入:server.close = () /** :WhatTypingHere */=> ...
任何帮助深表感谢。
解决方案
这里的问题是close
函数必须返回它绑定的值,在这种情况下,它可能是 type Server
。所以该close
函数应该是一个返回类型值的函数Server
。但是您的代码返回一个承诺,而不是一个Server
.
以另一种方式解决问题,通常人们通过将回调包装在 Promise 中来承诺,而不是通过覆盖回调本身。
function promisifiedServerClose(s: Server) {
return new Promise((resolve, reject) => {
s.close(err => {
if (!err) {
resolve(s);
} else {
reject(err);
}
});
});
}
这是一种非常常见的模式,您几乎总是可以使用它来承诺事物。
它将与.close
函数分开,因为这是一个承诺版本并且.close
是一个回调版本。重写一个众所周知的函数以使其做一些完全不同的事情不仅困难而且是一种非常糟糕和误导性的做法,因此请改用单独的函数。
推荐阅读
- laravel - 如何向 Laravel 6 Auth attempt() 方法添加附加条件?
- moodle - Moodle 错误“您无权在此处查看课程。”
- r - 当 `df1$DateTime==df2$DateTime` 时,如何将 `DateTime` 从 `df1` 更改为 `DateTime2` 从 `df2`。对于“df1”的其余行,我减去 60s
- python - 嵌套 while 和 for 循环中的无限循环
- c - 为什么在比较线性搜索和二进制搜索时每次都为零?
- ios - 视图控制器未初始化仍然内存泄漏
- unity3d - 运动学在统一中找不到吗
- python - 熊猫 7 天
- algorithm - 循环内的 console.log(i) 算作大 O 中的操作
- javascript - GAS/Javascript 在总结数字时给出错误的数字