运行单元测试时,“ TS2322:类型'超时'不能分配给类型'数字'”

时间:2019-04-06 14:32:06

标签: typescript unit-testing karma-runner karma-mocha

我有两个TypeScript程序包,一个程序包(程序包A)取决于另一个(程序包B)。每个软件包都有一个使用Karma设置的单元测试。当我从NPM安装所有依赖项后分别运行每个单元测试时,单元测试运行良好。但是,如果我在程序包A中使用npm link package-b并运行程序包A的单元测试,则会出现标题中指出的错误:“ TS2322:类型'超时'不能分配给类型'数字'。”

有问题的行是对setTimeout的调用。挖掘之后,我发现在不运行npm link的情况下分别运行测试时,TypeScript正确地将setTimeout中的typescript/lib/lib.dom签名识别为所需的类型,但是在失败的情况下使用了{{1} },它正在npm link中使用Node的setTimeout签名。我通过将@types/node/index的返回类型更改为setTimeout并在string处观察到与string相同的错误来证实这一点。

我不确定的是为什么 TypeScript编译器已决定在这种特定情况下使用替代定义,也不知道如何说服它使用所需的定义。我很高兴发布一些代码,但是由于失败行上的所有操作都是Timeout调用,因此我不确定在这种情况下有用的方法。

3 个答案:

答案 0 :(得分:6)

您可以使用:

let timeoutId: null | ReturnType<typeof setTimeout> = null
...
timeoutId = setTimeout(...)

它将根据您的上下文选择正确的声明。

使用vscode / tsc(NodeJS.Timeout)并运行ts-jest(数字)时,我看到了这种差异。这是整个事物在两侧进行类型检查的唯一方法。

答案 1 :(得分:0)

您可以尝试使用window.setTimeout而不是setTimeout,这样可以明确使用打字稿

答案 2 :(得分:0)

您可以使用以下内容:

let myTimeOut: NodeJS.Timeout | null = null;

myTimeOut = setTimeout(...);

然后当您将变量重置为初始状态时,您可以简单地:

myTimeOut = null;