【发布时间】: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