首页 > 解决方案 > 使用绑定时的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 包装在有界originalCloseconst 中。

我的问题是我怎样才能在这里得到正确的输入:server.close = () /** :WhatTypingHere */=> ...

任何帮助深表感谢。

标签: javascripttypescriptexpress

解决方案


这里的问题是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是一个回调版本。重写一个众所周知的函数以使其做一些完全不同的事情不仅困难而且是一种非常糟糕和误导性的做法,因此请改用单独的函数。


推荐阅读