在App中实现继承时遇TypeError: Super expression错误求助
这个错误的核心原因很明确:当你定义MyClass继承ExtendedClass时,ExtendedClass的值是undefined——而JavaScript要求extends关键字后面必须是一个有效的构造函数(或者null),不能是undefined。
我们一步步排查可能的问题:
1. 先检查模块导入路径是否正确
你的第二个文件里写了import {ExtendedClass} from './BaseFile',首先要确认这个路径和BaseFile.js的实际位置完全匹配:
- 如果
BaseFile.js和当前文件在同一目录,路径没问题;如果在子目录,要写成./subdir/BaseFile; - 有些严格的ES模块运行环境可能需要加上
.js后缀,试试改成:import {ExtendedClass} from './BaseFile.js';
2. 确认Node.js环境的ES模块配置(如果适用)
如果是在Node.js中运行这段代码,默认情况下Node会把.js文件当作CommonJS模块处理,而你用了ES模块的import/export语法,这会导致模块解析异常,进而出现导入的类为undefined的情况。
解决方法是在项目的package.json中添加一行:
"type": "module"
这样Node就会把所有.js文件当作ES模块处理,import/export就能正常工作了。
3. 排查是否存在循环引用
如果BaseFile.js中也导入了MyClass所在的文件,就会形成循环引用。在循环引用场景下,模块初始化时会出现“先导入的部分还未完成定义”的情况,导致ExtendedClass在MyClass中被导入时是undefined。
你可以检查BaseFile.js的代码,看看有没有导入当前文件的语句。如果有,重构代码:把共享的逻辑移到单独的文件,或者调整导入的时机来打破循环。
4. 验证类的定义顺序(你的代码这里是对的,但还是提一下)
ES6类没有声明提升特性,所以必须先定义父类,再定义子类。你的BaseFile.js中先定义BaseClass,再定义继承它的ExtendedClass,这个顺序是正确的,不会导致问题。
顺便说一句:如果上述问题都排查过,你的代码逻辑本身是没问题的——当模块正确解析后,MyClass继承ExtendedClass、调用super('default')的写法完全符合ES6类的规范。
内容的提问来源于stack exchange,提问作者Koli96

