【问题标题】:Typescript Overloaded Function打字稿重载函数
【发布时间】:2020-05-20 20:07:11
【问题描述】:

我试图在 Server 对象上调用重载函数 listen。似乎正在发生的事情是编译器将错误的方法与调用匹配,即使存在匹配的定义。我什至不确定如何进行调试。

Server 对象有如下定义

class Server extends events.EventEmitter {
        constructor(connectionListener?: (socket: Socket) => void);
        constructor(options?: { allowHalfOpen?: boolean, pauseOnConnect?: boolean }, connectionListener?: (socket: Socket) => void);

        listen(port?: number, hostname?: string, backlog?: number, listeningListener?: () => void): this;
        listen(port?: number, hostname?: string, listeningListener?: () => void): this;
        listen(port?: number, backlog?: number, listeningListener?: () => void): this;
        listen(port?: number, listeningListener?: () => void): this;
        listen(path: string, backlog?: number, listeningListener?: () => void): this;
        listen(path: string, listeningListener?: () => void): this;
        listen(options: ListenOptions, listeningListener?: () => void): this;
        listen(handle: any, backlog?: number, listeningListener?: () => void): this;
        listen(handle: any, listeningListener?: () => void): this;

...

以下编译并运行良好:

server.listen(8080)

以下内容根本无法编译:

server.listen(8080, '0.0.0.0')

智能感知报告

No overload matches this call.
  The last overload gave the following error.
    Argument of type '"0.0.0.0"' is not assignable to parameter of type '() => void'.ts(2769)
net.d.ts(193, 9): The last overload is declared here.

编译器同样抱怨:

node_modules/ts-node/src/index.ts:261
    return new TSError(diagnosticText, diagnosticCodes)
           ^
TSError: ⨯ Unable to compile TypeScript:
lib/app.ts(333,35): error TS2345: Argument of type '"0.0.0.0"' is not assignable to parameter of type '() => void'.

    at createTSError (node_modules/ts-node/src/index.ts:261:12)
    at getOutput (node_modules/ts-node/src/index.ts:367:40)
    at Object.compile (node_modules/ts-node/src/index.ts:558:11)
    at Module.m._compile (node_modules/ts-node/src/index.ts:439:43)
    at Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Object.require.extensions.(anonymous function) [as .ts] (node_modules/ts-node/src/index.ts:442:12)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)

提前致谢!

【问题讨论】:

  • 澄清一下,您希望 TS 与哪个定义相匹配?
  • 其中之一:listen(port?: number, hostname?: string, backlog?: number, listeningListener?: () => void): this; listen(port?: number, hostname?: string, listeningListener?: () => void): this;

标签: node.js typescript express intellisense


【解决方案1】:

我今天遇到了同样的问题。 不确定发生这种情况的真正原因,但我已经通过方法 call 传递参数来修复它。

server.listen.call(server, 4000, '0.0.0.0', () => {
  console.log(server.address()) // output is { address: '0.0.0.0', family: 'IPv4', port: 4000 }
});

【讨论】:

    【解决方案2】:

    您的类型不匹配。 process.env.PORT 是字符串类型,而函数接受数字。 这应该可以解决它:

    const port = Number(process.env.PORT) || 3000;
    

    【讨论】:

      猜你喜欢
      • 2017-01-04
      • 2019-07-04
      • 1970-01-01
      • 1970-01-01
      • 2019-02-07
      • 2019-01-24
      • 2022-06-11
      • 1970-01-01
      相关资源
      最近更新 更多