导出TypeScript类时遇Unexpected identifier错误,求排查方案
问题排查:TypeScript类在Mocha测试中出现Unexpected identifier错误
我有一个名为Polynomial的TypeScript类,想要将其制作成npm模块,用Mocha编写测试脚本验证时,直接require了Polynomial.ts文件,执行npm test时,在类的private coefMap: Map<string, string> = new Map();行出现Unexpected identifier错误。相关代码及配置如下:
测试脚本(Polynomial.test.js)
const Polynomial = require('./Polynomial.ts'); const assert = require('assert').strict; describe("First test", function() { it("test", function() { let p = new Polynomial(); assert(p.equals(new Polynomial("0"))); }); });
TypeScript类(Polynomial.ts)
class Polynomial { private coefMap: Map<string, string> = new Map(); // <--- 报错行 // ... } module.exports = Polynomial;
package.json
{ "name": "multivariate-polynomial", "version": "1.0.0", "main": "index.js", "scripts": { "test": "mocha Polynomial.test.js" } }
tsconfig.json
{ "compilerOptions": { "target": "es5", "lib": [ "dom", "dom.iterable", "esnext" ], "module": "commonjs", "declaration": true, "outDir": "./lib", "strict": true } }
错误原因
- Node.js和Mocha默认只能解析原生JavaScript语法,无法识别TypeScript专属特性(比如
private访问修饰符、Map<string, string>类型注解)。直接用require加载未编译的.ts文件,会被当作JS解析,自然触发语法错误。 - 现有配置虽指定了TS编译输出目录,但测试流程没有先执行TS编译,也未配置Mocha支持TS文件的直接运行。
解决方案
方案一:先编译TS代码再执行测试
- 修改
package.json的脚本,新增编译命令并让测试依赖编译结果:
{ "scripts": { "build": "tsc", "test": "npm run build && mocha ./lib/Polynomial.test.js" } }
注意:如果测试脚本还是
.js格式,需要把测试里的require('./Polynomial.ts')改成require('./lib/Polynomial.js');更规范的做法是把测试文件改成.ts格式,编译后会自动输出到lib目录。
- 调整TypeScript类的导出方式,符合TS规范:
// Polynomial.ts export class Polynomial { private coefMap: Map<string, string> = new Map(); // ... }
方案二:配置Mocha直接支持TypeScript(无需提前编译)
- 安装依赖包:
npm install --save-dev ts-node typescript @types/mocha @types/node
- 修改
package.json的测试脚本:
{ "scripts": { "test": "mocha -r ts-node/register Polynomial.test.ts" } }
- 将测试脚本改为TS格式(
Polynomial.test.ts),并调整导入逻辑:
// Polynomial.test.ts import { Polynomial } from './Polynomial'; import assert from 'assert/strict'; describe("First test", function() { it("test", function() { let p = new Polynomial(); assert(p.equals(new Polynomial("0"))); }); });
内容的提问来源于stack exchange,提问作者Daniel Zufrí Quesada
相关产品推荐
相关产品推荐

