笑话:TypeError:无法读取未定义的属性

Posted

技术标签:

【中文标题】笑话:TypeError:无法读取未定义的属性【英文标题】:Jest: TypeError: Cannot read property of undefined 【发布时间】:2018-10-29 19:58:27 【问题描述】:

我正在尝试测试我的 React 类,它具有 import dotnetify from "dotnetify"; 导入。这很好用,但 Jest 说,dotnetify 是未定义的。如果我更改为const dotnetify = require("dotnetify");,Jest 通过了测试,但这是一种愚蠢的解决方法。怎么解释 Jest,那个 dotnetify 不是 undefined?

比你提前。

【问题讨论】:

【参考方案1】:

这不能向 Jest '解释',它真的是未定义的。

在 TypeScript 中有几种处理 CommonJS 模块的方法。正如this answer 中所述,只有在使用esModuleInterop (allowSyntheticDefaultImports) 编译器选项启用合成导入时,CommonJS 包中才会有默认导入。

否则应该这样做:

import * as dotnetify from "dotnetify";

或者使用特定于 TypeScript 的语法:

import dotnetify = require("dotnetify")

【讨论】:

import * as dotnetify from "dotnetify" 对我来说是最好的方法。谢谢! 不客气。其他两个被认为更具前瞻性,但我想在这种特殊情况下这没什么大不了的。 我还能尝试什么?我同时启用了 esModuleInterop 和 allowSyntheticDefaultImports,并且我收到来自 typescript 模块而不是 CommonJS 的错误。我的导出非常简单,例如export let config: AppConfig;,然后是config = ...,然后是文件结尾export default config;。然后导入另一个文件import config from '@/services/config.service'; 开玩笑地失败,在应用程序中工作就像一个魅力。 const config = require('@/services/config.service'); 修复了问题,但我不喜欢在我的现代 2020 打字稿项目中使用:D @Luckylooke 究竟是什么错误?如果您尝试过import config from '@/services/config.service',您是否尝试将默认导入替换为* as config,正如答案所暗示的那样? import..require 是特定于 TS 的语法,为 require 提供类型安全。您将需要 require 在 Jest 中以任何方式进行模块模拟。 @Luckylooke 问题和答案特定于第三方 CommonJS 节点包,例如点网化。你自己的 ES 模块 有问题意味着 Jest+Babel+TS 设置在某些时候出错了。我建议提出一个新问题,以显示您的设置并解释问题。

以上是关于笑话:TypeError:无法读取未定义的属性的主要内容,如果未能解决你的问题,请参考以下文章

反应笑话单元测试用例TypeError:无法读取未定义的属性'then'

Expo TypeError 的笑话模拟权限:无法读取未定义的属性“askAsync”

无法读取未定义的属性“getters” - 带有笑话的 VueJS 单元测试

如何使用自定义错误消息捕获“TypeError:无法读取未定义的属性(读取'0')”?

TypeError:无法读取未定义的属性(读取“名称”)

TypeError:无法读取未定义的属性“findAll”(expressjs)