TypeScript ts-jest 预处理器的目的是啥?

Posted

技术标签:

【中文标题】TypeScript ts-jest 预处理器的目的是啥?【英文标题】:What's the purpose of TypeScript ts-jest pre-processor?TypeScript ts-jest 预处理器的目的是什么? 【发布时间】:2018-12-02 19:56:30 【问题描述】:

我对 TypeScript(和 javascript)还很陌生,所以这可能很明显,但我不明白使用像 ts-jest 这样的预处理模块来针对 TypeScript 代码运行 Jest 测试有什么意义。我正在 Node 上开发一个 TypeScript 项目,我正在使用 Jest 测试所有内容,到目前为止它运行良好。

我正在将我的 TypeScript 代码(和测试)转换为 JavaScript (ES5),然后我正在使用 Jest 对转换后的 ES5 JavaScript 运行 Jest - 一切正常,无需 ts-jest。

那么使用 ts-jest 有什么意义呢?换句话说——我会在什么情况下使用它?

我看到过像 here 这样的建议,使用 ts-jest 来“预处理打字稿文件”,但我不明白。我认为 TypeScript 的全部意义在于它为您处理所有这些,那么为什么您需要使用 ts-jest 单独执行这些操作呢?此外,没有它我也能过得很好。

也许我没有得到:

    转译和预处理的区别 Jest的transform property的含义

这是我的 tsconfig.json:


    "compilerOptions": 
        "strictNullChecks": true,
        "noImplicitAny": true,
        "moduleResolution": "node",
        "target": "es5",
        "lib": [
            "es6"
        ]
    ,
    "include": [
        "src/**/*",
        "test/**/*",
    ],

这是我的 package.json 的 sn-p:


  "scripts": 
    "test": "jest",
    "dev": "nodemon ./src/app",
    "start": "node ./src/app"
  ,

  "devDependencies": 
    "@types/express": "^4.16.0",
    "@types/jest": "^23.1.1",
    "jest": "^23.1.0",
    "nodemon": "^1.17.5"
  ,

  "jest": 
    "transform": ,
    "testRegex": "/test/.*\\.(ts|tsx|js)$"
  

【问题讨论】:

【参考方案1】:

我注意到的第一件事是你的 package.json 中没有打字稿。这意味着您已经全局安装了 typescript 编译器,从命令行运行它,并让 .js 文件与 .ts 文件并排生成。当你运行 node 时,它​​会运行 .js 文件。

虽然这种方法看起来很方便,但它依赖于全局安装的 tsc,并且依赖于手动运行 tsc。这使得不熟悉项目的人很难运行这个项目(即使你是几个月的时间)。 要解决此问题,您可以在本地安装 typescript(将其添加到 package.json),然后自动运行它(npm run start)。

现在,关于您的问题: 1.转译和预处理的区别

其实是一样的

    Jest的transform属性的含义

    这简化了测试运行,您不必全局安装 typescript 并手动运行。 Ts-jest 为您转换它。

您可能还想看看https://github.com/TypeStrong/ts-node,它类似于节点,但您不需要自己转译打字稿。

并且 nodemon 支持这样的打字稿(nodemon.js):


  "watch": ["src"],
  "ext": "ts",
  "ignore": ["src/**/*.test.ts"],
  "exec": "ts-node ./src/index.ts"

【讨论】:

是的,我确实在全球范围内安装了 Typescript,但我使用的是对 TypeScript 具有原生支持的 VS Code,因此编译我的代码不是问题。至于“转译和预处理”以及它们是如何相同的 - 谢谢,我只是觉得有多个术语表示同一件事令人困惑。至于 ts-jest 为我转换我的代码 - 再次,看起来 ts-jest 只是在做 TypeScript 已经在做的事情 - 将 TypeScript 转换为 JavaScript。所以如果我在本地安装 TypeScript,我仍然看不到 ts-jest 的需要。至于 ts-node - 再次,我不明白目的 - TypeScript 为我做这个

以上是关于TypeScript ts-jest 预处理器的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Jest mock 总是给出 undefined (typescript + ts-jest)

Jest、Typescript、ts-jest:覆盖范围略有不正确

为 react typescript 项目设置 ts-jest

ts-jest:将“@”字符映射到 /src 文件夹

Jest / Ts-Jest / Babel:调试失败。错误表达式:输出生成失败

使用 React、Typescript 和 ES6 进行 Jest 测试