You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置TypeScript/ts-jest优先导入.ts文件而非同名.js文件?

问题:构建生成JS文件后Jest测试导入优先级错误

场景说明

测试文件示例

// fileA.spec.ts
import fileA from "services/fileA"

// 测试逻辑...

构建后文件结构

src
- services
-- fileA.ts
-- fileA.js --> 构建脚本生成的文件
-- fileA.spec.ts

问题现象

生成JS文件前运行Jest测试一切正常,但生成JS文件后,测试会优先导入对应的JS文件,导致测试报错。需要配置TypeScript或ts-jest,让导入解析时优先选择TS文件,忽略生成的JS文件。

当前配置文件

tsconfig.json

{
  "compilerOptions": {
    "allowSyntheticDefaultImports": true,
    "baseUrl": "scripts",
    "lib": [ "dom", "es7" ],
    "module": "ES2015",
    "moduleResolution": "Node",
    "esModuleInterop": true,
    "noEmitOnError": true,
    "noImplicitAny": true,
    "target": "es5",
    "sourceMap": true,
    "paths": {
      "config/*": ["config/*"],
      "interfaces/*": ["interfaces/*"],
      "modules/*": ["modules/*"],
      "services/*": ["services/*"],
      "third-party/*": ["third-party/*"],
      "vue-components/*": ["vue-components/*"]
    }
  },
  "include": [
    "**/*.ts",
    "**/*.vue"
  ]
}

jest.config.js

const { pathsToModuleNameMapper } = require('ts-jest')
const { compilerOptions } = require('./tsconfig')

/** @type {import('ts-jest').JestConfigWithTsJest} */
module.exports = {
  testEnvironment: 'jsdom',
  roots: ['<rootDir>'],
  moduleDirectories: ["node_modules", "<rootDir>"],
  modulePaths: [compilerOptions.baseUrl],
  moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths),
  moduleFileExtensions: ["js", "ts", "json", "vue"],
  transform: {
    // 用ts-jest处理*.ts文件
    "^.+\\.ts$": "ts-jest",
    // 用vue-jest处理*.vue文件
    ".*\\.vue$": "vue-jest"
  },
  testRegex: [
    "**/*.spec.ts",
  ],
  setupFilesAfterEnv: ["./jest-setup.ts"]
};

解决方案

1. 调整Jest的文件扩展名优先级

问题核心在于jest.config.js中moduleFileExtensions的顺序,Jest会按数组顺序查找文件。将ts移到js前面,就能优先选择TS文件:

moduleFileExtensions: ["ts", "js", "json", "vue"],

2. 让TypeScript忽略生成的JS文件(可选)

在tsconfig.json中添加exclude配置,避免TypeScript编译时处理生成的JS文件,减少潜在冲突:

"exclude": [
  "**/*.js",
  "node_modules"
]

3. 强制模块映射指向TS文件(可选)

如果上述调整仍未解决问题,可以在jest.config.js的moduleNameMapper中添加规则,明确指定services/*的导入路径对应TS文件:

moduleNameMapper: {
  ...pathsToModuleNameMapper(compilerOptions.paths),
  "^services/(.*)$": "<rootDir>/scripts/services/$1.ts"
},

这些配置修改后,Jest在运行测试时会优先加载TS源文件,不再被生成的JS文件干扰。

内容的提问来源于stack exchange,提问作者Jmh2013

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 02:13:23