【问题标题】:Typescript Method overload with "identical signature"带有“相同签名”的打字稿方法重载
【发布时间】:2021-05-26 14:39:35
【问题描述】:

考虑这段代码:

class Socket extends EventEmitter {
...
        on(event: string, listener: (...args: any[]) => void): this;
        on(event: "close", listener: () => void): this;
        on(event: "connect", listener: () => void): this;
        on(event: "error", listener: (err: Error) => void): this;
        on(event: "listening", listener: () => void): this;
        on(event: "message", listener: (msg: Buffer, rinfo: RemoteInfo) => void): this;
...
}

来自 typescript / node.js 类型定义文件中的模块“dgram”,这是来自 node.js 的“the”udp 服务器。代码在“dgram.d.ts”文件中。

当我在 Visual Studio Code 中编写 Socket.on(" 使用它时,它会将这个方法的第一个参数解析为:close、connect、error、listening、message,就好像它是一个枚举一样。

我什至无法为这个“机制”命名正确的术语,这是什么?通常在参数中,它的左侧是变量名,右侧是类型示例(事件:字符串)。但在这里看起来文字字符串又是一个有效类型,而且它非常聪明,可以在重载示例中解决它(事件:“关闭”) 如果我在一个简单的单个函数中使用 myparameter:"myliteralString" 之类的东西,它甚至没有意义,据我所知,它只有与重载结合使用才有意义。

如果你能说出这些概念或幕后发生的事情(比如隐式构建数组或类似的东西,这使得这项工作有效。我很高兴,我只是想了解它。

感谢您的宝贵时间!

【问题讨论】:

  • 您在寻找literal types 的文档吗?或者像discriminated unions 这样的东西,因为虽然重载签名并不能完全构成这样的联合,但您可以refactor it into one。当您关心特定值时,文字类型才有意义;我不会说像foo(x: "onlyThis"): void 这样的函数没有意义,但它不是很有用。
  • 这是我正在寻找的文献,“文字类型”谢谢!

标签: typescript methods overloading


【解决方案1】:

你指的是Overload Signature吗?

也许事件的类型是这样定义的:

【讨论】:

  • 这是我正在寻找的文献,“文字类型”谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-11-18
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
  • 1970-01-01
相关资源
最近更新 更多