【问题标题】:TS2345 when passing argument to resolve()将参数传递给 resolve() 时的 TS2345
【发布时间】:2021-03-13 01:41:43
【问题描述】:

我正在尝试在本地运行 https://github.com/FullHuman/purgecss 的单元测试,但出现错误:

error TS2345: Argument of type 'Stats | undefined' is not assignable to parameter of type 'Stats | PromiseLike<Stats>'

The line it's referring to 调用带有潜在未定义参数的 promise 的 resolve() 回调。但是,VSCode 似乎表明resolve() 的参数的类型签名包括undefined,因此它不应该引发类型错误。有没有什么好的方法来调试这个,或者权威地查看resolve()的类型签名?

这是引发类型错误的代码块:

function runWebpack(options: Configuration): Promise<webpack.Stats> {
  const compiler = webpack(options);
  return new Promise<webpack.Stats>((resolve, reject) => {
    compiler.run((err?: Error, stats?: Stats) => {
      if (err) reject(err);
      if (stats?.hasErrors()) reject(new Error(stats.toString()));
      resolve(stats); // error TS2345: Argument of type 'Stats | undefined' is not assignable to parameter of type 'Stats | PromiseLike<Stats>'
    });
  });
}

【问题讨论】:

  • 不确定您是如何看到此错误的。它看起来很好,因为在参数 resolve 周围定义的 PromiseConstructor 应该包含 undefined
  • 请在此处包含问题中的所有相关代码。用户无需访问站外链接即可回答或理解任何答案。
  • "VSCode 似乎表明 resolve() 的参数的类型签名包括 undefined" 正好相反 stats 是一个可选参数,因此可以not 在这种情况下将 stats 传递给 undefined。错误告诉你 - 你不能传递可能是 undefined 的东西,因为它不是承诺的预期结果。

标签: javascript typescript visual-studio-code es6-promise


【解决方案1】:

VSCode 似乎表明 resolve() 的参数的类型签名包括 undefined

这不是 Visual Studio Code,而是 TypeScript 编译器。由于您已将stats 声明为Stats 类型的可选参数,这表明可以 传递该参数,因此真正的类型是Stats | undefined。但是,由于您使用 new Promise&lt;webpack.Stats&gt;,这会将解决此承诺的可能值限制为 Stats,而不是 undefined

没有足够的信息让 TypeScript 得出结论:resolve(stats) 只有在stats undefined 时才会被调用。您应该重新构建条件以排除 undefined 值:

compiler.run((err?: Error, stats?: Stats) => {
  if (err) reject(err);
  if (stats)
    if (stats.hasErrors()) reject(new Error(stats.toString()));
    else resolve(stats);
});

【讨论】:

    猜你喜欢
    • 2013-02-11
    • 1970-01-01
    • 2010-10-21
    • 2020-12-14
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    相关资源
    最近更新 更多