"参考错误:structuredClone未定义"使用jest和nodejs & typescript

xjreopfe  于 2023-02-03  发布在  Node.js
关注(0)|答案(3)|浏览(1301)

我在一个使用typescript的简单NodeJS应用程序中使用jest运行测试。我的测试抛出一个错误:ReferenceError: structuredClone is not defined.
我没有得到任何linter错误和代码编译正常罚款。

const variableForValidation = structuredClone(variableForValidationUncloned);

package.json:

"dependencies": {
    ...
  },
  "devDependencies": {
    "@types/jest": "^29.0.0",
    "@types/node": "^18.7.15",
    "@typescript-eslint/eslint-plugin": "^5.36.1",
    "@typescript-eslint/parser": "^5.36.1",
    "eslint": "^8.23.0",
    "jest": "^28.0.1",
    "nodemon": "^2.0.19",
    "serverless-plugin-typescript": "^2.1.2",
    "ts-jest": "^28.0.8",
    "ts-node": "^10.9.1",
    "typescript": "^4.8.2"
  }

这个github问题让我觉得这个问题已经解决了:还是我误会了?
我见过一个类似的Stack问题,但使用的是摩卡咖啡:mocha not recognizing structuredClone is not defined

xxls0lw8

xxls0lw81#

structuredClone已添加到节点17。
如果你不能更新,JSON破解(stringify then parse)工作,但has some shortcomings可能与你相关:

  • 递归数据结构:stringify()在你给予它一个递归数据结构时会抛出,这在处理链表或树时很容易发生。
  • 内置类型:如果值包含其他JS内置函数,如Map、Set、Date、RegExp或ArrayBuffer,那么JSON.stringify()将抛出。
  • 函数:JSON.stringify()会悄悄地丢弃函数。
    编辑

我最近了解了json-stringify-safe,它有助于解决循环问题。

tzdcorbm

tzdcorbm2#

我想不出来,所以我设置了自己的全局:

// globals.ts
if(!global.structuredClone){
    global.structuredClone = function structuredClone(objectToClone: any) {
          const stringified = JSON.stringify(objectToClone);
          const parsed = JSON.parse(stringified);
          return parsed;
        }
}
// entry point of app, eg index.ts:
import './globals.ts'
// ...

我想这可能是因为我的tsconfig中的target在添加structuredClone之前将我的 typescript 文件转换为javascript/node版本?

p8h8hvxi

p8h8hvxi3#

对于同样的错误,在测试文件中使用下面的代码可以解决这个问题。

global.structuredClone = (val) => JSON.parse(JSON.stringify(val))

参考文献

相关问题