我有两个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
调用,因此我不确定在这种情况下有用的方法。
答案 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;