我正在尝试在本地运行https://github.com/FullHuman/purgecss,但我收到一个错误:
error TS2345: Argument of type 'Stats | undefined' is not assignable to parameter of type 'Stats | PromiseLike<Stats>'
它所指的行调用具有潜在未定义参数的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>'
});
});
}
VSCode似乎指示
resolve()
参数的类型签名包括undefined
这不是Visual Studio代码,而是TypeScript编译器。由于您已将stats
声明为类型为Stats
的可选参数,该参数表示可以而不传递该参数,因此实际类型是Stats | undefined
。但是,由于您使用new Promise<webpack.Stats>
,这将解析此承诺的可能值限制为Stats
,而不是undefined
。
TypeScript没有足够的信息来断定只有当stats
是而不是undefined
时才会调用resolve(stats)
。您应该重新构造条件语句以排除undefined
值:
compiler.run((err?: Error, stats?: Stats) => {
if (err) reject(err);
if (stats)
if (stats.hasErrors()) reject(new Error(stats.toString()));
else resolve(stats);
});