当前位置: 首页 > 知识库问答 >
问题:

“TS2322:运行单元测试时,类型‘Timeout’不可分配给类型‘number’”

谈秦斩
2023-03-14

我有两个TypeScript包,其中一个包(包A)依赖于另一个包(包B)。每个包都使用Karma设置了一个单元测试。在安装了NPM中的所有依赖项之后,当我分别为每个依赖项运行单元测试时,单元测试运行良好。然而,如果我在包A中使用npm link package-b并运行包A的单元测试,那么我会得到标题中所述的错误:“TS2322:类型‘Timeout’不可分配给类型‘number’。”

该行是对setTimeout的调用。挖掘之后,我发现在没有npm链接的情况下单独运行测试时,TypeScript在TypeScript/lib/lib中正确地识别了setTimeout签名。dom作为所需类型,但在使用npm链接后出现故障的情况下,它在类型/节点/索引中使用节点的设置超时签名。我通过将setTimeout上的返回类型更改为string,并用string代替Timeout来观察相同的错误,从而证实了这一点。

我不确定的是为什么TypeScript编译器决定在这个特定的情况下使用替代定义,也不知道我如何说服它使用所需的定义。我很乐意发布一些代码,但我不确定在这种情况下什么是有用的,因为失败行上的所有内容都是setTimeout调用。

共有3个答案

乌和畅
2023-03-14

默认情况下,types cript包含所有。/node_modules/@类型/*。如果您有。/node_modules/@类型/节点,它的超时类型将覆盖Web类型(返回一个数字,而不是NodeJS. Timeout)。

您可以通过显式清空tsconfig中的类型来解决这个问题。json:

{
  "compilerOptions": {
    "types": []
  }
}

实际上,您可能正在进行一个需要其他类型和LIB的项目,因此您可能希望带回ES和DOM LIB:

{
  "compilerOptions": {
    "types": [],
    "lib": ["ESNext", "DOM"]
  }
}
上官扬
2023-03-14

您可以使用:

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

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

我在使用vscode/tsc(NodeJS.Timeout)和运行ts jest(number)时看到了这种差异。这是整件事在双方都进行打字检查的唯一方式。

公良育
2023-03-14

您可以尝试使用窗口。setTimeout不是setTimeout,而是显式使用typescript

 类似资料:
  • 我正在尝试定义一个基本接口,其中包含一个箭头函数作为属性。但是,它给了我一个TS错误。 TS2322:类型'(测试:数字)= 事实上,我不理解这个错误,因为我想要一个字符串或一个数字作为我的函数的参数,它告诉我我不能只使用数字。如何将字符串或数字作为箭头函数的输入? 此外,当我这样做,错误消失 为什么?

  • 将以下代码转换为typescript时出错。 错误TS2339:属性样式在元素类型上不存在。 当我为如下相同的值分配所需值时 那么误差在元素上,那就是 错误TS2322:类型“Element | null”不可分配给类型“{style:any;}”。类型“null”不可分配给类型“{style:any;}”。

  • 这是我的水果 现在我正在导入另一个typescript文件中的fruit.ts。这是我的 当我做的时候 我得到一个错误: 类型“string”不能分配给类型“orange”“apple”“banana”“ 如何将字符串赋给自定义类型fruit的变量?

  • 这段代码给出了一个运行时错误: < li >为什么< code>b.get()不会触发运行时错误? < li >为什么只有当我试图获取class变量的类时才会出现运行时错误? 更准确地说:为什么编译器仅为第二个(导致异常)在字节码中插入指令?

  • 这是一个类中的函数,允许你双击和单击手势。它在Swift 2.3中运行良好,但在转换到Swift 3后,它抛出了一些错误。我怎么也想不明白。我评论了它们发生的地方。