【问题标题】:What is a Promise<{}>?什么是 Promise<{}>?
【发布时间】:2018-12-22 08:20:24
【问题描述】:

我想创建一个在 WebSocket 连接时完成的承诺。

import * as WebSocket from "ws"

let ws = WebSocket("ws://example.com")

function foo(echo: string) {
    return new Promise((resolve, reject) => ws.once("open", () => resolve(echo)));
}

在 VS Code 中,foo 函数推断为产生 Promise&lt;{}&gt;

  1. 什么Promise&lt;{}&gt;
  2. 更一般地说,我如何让这个引用Promise&lt;string&gt;?我是不是误会Trigger Promise when an event fires

【问题讨论】:

  • 可能是return new Promise&lt;string&gt;(...);?
  • 呃,刚刚发现 stackoverflow.com/questions/36967176/what-is-type 推断类型中的 {} 是否总是编译器问题?
  • 可能。我还没有那么使用 TypeScript,但如果你愿意,我可以查看全局 .d.ts 文件以了解这个特定缺点的解释。
  • @PatrickRoberts 在那种情况下,我想知道为什么 TS 不能在这里推断类型,以及为什么它在推断的类型中放了一个奇怪的 {} ...(对不起,这应该已回复Promise&lt;string&gt;的建议)
  • FWIW here's the issue 讨论了这个限制。

标签: javascript node.js typescript events promise


【解决方案1】:

泛型具有{}(空对象)作为default parameter value

Promise 是一个泛型。由于 TypeScript 的限制,无法从 resolve 参数中推断出泛型类型,因此默认为 {} 或空对象。

应该是:

function foo(echo: string) {
    return new Promise<string>((resolve, reject) => ws.once("open", () => resolve(echo)));
}

【讨论】:

  • 嗯,很有趣。你有任何链接/来源吗?我想更多地了解这些限制,以便我知道将来何时遇到它们。编辑:哦,它似乎在默认参数值链接中。
  • (我实际上赞成你,仅供参考,此评论不是对你答案的批评)我自己在寻找这些“TypeScript 限制”,但 lib.es2015.promise.d.tsnew 定义为 new &lt;T&gt;(executor: (resolve: (value?: T | PromiseLike&lt;T&gt;) =&gt; void, reject: (reason?: any) =&gt; void) =&gt; void): Promise&lt;T&gt;;所以鉴于echo 被声明为string,我似乎无法理解TS 无法从传递给resolve 的值推断T 的事实。
  • 等等,我在链接中没有看到任何关于将空对象作为默认参数值的内容。
  • 泛型就是这样工作的。有一些怪癖没有在任何地方描述,因为 TS 参考基本上是一个指南(参见这个通用问题,例如,stackoverflow.com/questions/50262700/…) Promise 泛型类型和解析参数类型之间的联系太复杂了。它只在一个方向上起作用。即,无法推断泛型类型,但如果提供了错误的类型,则会导致类型错误,例如Promise&lt;number&gt;resolve(echo).
  • @PatrickRoberts 谢谢。我不知道确切的复杂性是什么,但我想如果可以从中推断出多个点,则 T 将更难推断。我确定 TS 存储库中的某个地方存在未解决的问题,带有“需要讨论”标签的标签解决了这个问题,但没有分配给任何人。
猜你喜欢
  • 2012-06-15
  • 2020-02-02
  • 2018-01-24
  • 2015-05-09
  • 2017-09-11
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多