node.js - "ReferenceError: structuredClone är inte definierad" när man använder jest med nodejs och typescript


Jag kör tester med jest i en enkel NodeJS-app som använder TypeScript. Mitt test ger ett fel: ReferenceError: structuredClone är inte definierad.

Jag får inga linter-fel och koden kompilerar normalt utan problem.

  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"
  }

Detta GitHub-issue antyder för mig att problemet har lösts: https://github.com/facebook/jest/issues/12628 - eller kanske missförstår jag?

Jag har sett en liknande fråga på Stack men med Mocha: mocha känner inte igen structuredClone som inte är definierad

Svar #1

structuredClone lades till i Node 17.

Om du inte kan uppdatera fungerar JSON-tricket (stringify och sedan parse), men har vissa begränsningar som kan vara relevanta för dig:

  • Rekursiva datastrukturer: JSON.stringify() kommer att kasta ett fel när du ger den en rekursiv datastruktur. Detta kan hända ganska lätt när man arbetar med länkade listor eller träd.
  • Inbyggda typer: JSON.stringify() kommer att kasta ett fel om värdet innehåller andra inbyggda JS-typer som Map, Set, Date, RegExp eller ArrayBuffer.
  • Funktioner: JSON.stringify() kommer tyst att kasta bort funktioner.

Redigera 2feb23:

Jag lärde mig nyligen om json-stringify-safe, som hjälper med det cirkulära problemet.

Redigera 24jan25:

Det finns andra alternativ, sorterade efter GitHub-stjärnor:

  • Flight Controls superjson - 4,3k
  • Yahoo:s serialize-javascript - 2,8k
  • Rich Harris devaluerar - 2,2k

Svar #2

För samma fel löste det problemet för mig att ha koden nedan i testfilen.

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

Referens

Relaterade artiklar