类型错误:无法分配给对象“#<Performance>”的只读属性“now”

Moh*_*gga 5 node.js npm

我刚刚将节点升级到最新版本 v16.13.1 我尝试运行现有项目,但它因以下错误而崩溃:

performance.now = present;
                ^
TypeError: Cannot assign to read only property 'now' of object '#<Performance>'
    at Function.present.conflict (/Project_Path/node_modules/mstime/dist/cjs/present.js:39:19)
    at Object.<anonymous> (/Project_Path/node_modules/mstime/dist/cjs/present.js:41:9)
    at Module._compile (node:internal/modules/cjs/loader:1101:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
    at Object.require.extensions.<computed> [as .js] (/Project_Path/node_modules/ts-node/src/index.ts:485:14)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Module.require (node:internal/modules/cjs/loader:1005:19)
    at require (node:internal/modules/cjs/helpers:102:18)
    at Object.<anonymous> (/Project_Path/node_modules/mstime/dist/cjs/index.js:5:16) 
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释这个错误以及如何解决它吗?

小智 6

从节点 v14 升级到 v16 后,我刚刚在一些 Jest 单元测试中遇到了这个问题。

在我的测试中,我正在监视模拟其实现now()的方法performance,但我收到了相同的错误消息:

jest.spyOn(performance, "now")
  .mockImplementationOnce(() => 1000)
  .mockImplementationOnce(() => 2000);

// TypeError: Cannot assign to read only property 'now' of object '#<Performance>'
Run Code Online (Sandbox Code Playgroud)

正如它所暗示的,该now属性是只读的,不能重新分配。作为一种解决方法,我曾经Object.defineProperty将其设置为可写。之后模拟实现运行良好。

// redefining readonly property of the performance object
Object.defineProperty(performance, "now", {
  value: jest.fn(),
  configurable: true,
  writable: true
});

// mocking an execution delta of 1000ms
jest.spyOn(performance, "now")
  .mockImplementationOnce(() => 1000)
  .mockImplementationOnce(() => 2000);

// ok now
Run Code Online (Sandbox Code Playgroud)