【问题标题】:Prevent jest from interfering with typescript防止玩笑干扰打字稿
【发布时间】:2020-08-19 17:04:10
【问题描述】:

在面向 es5 时如何使用 jest 和 typescript?我安装的 jest 似乎导致 typescript 错误地认为某些对象方法存在,而实际上它们并不存在。

总结 在安装 jest 之前,npx tsc ./index.ts --target es5 会抛出一个错误,因为 Object.values 在 es5 中不存在,正如我所期望的那样。安装 jest 后,相同的命令不再抛出错误。注意:我不是问如何使用 Object.values,我是在问为什么 typescript 不应该让我这样做。

下面是一个最小的例子。

设置

目录:

node_modules/
index.js
index.ts
package.json
package-lock.json

// package.json
{
  "main": "index.js",
  "devDependencies": {
    "jest": "^26.4.0",
    "typescript": "^3.9.7"
  }
}

// index.ts
export const f = (x: Object) => Object.values(x);

我希望 typescript 在编译时会抛出错误,因为 Object.valueses5 中不可用。这会发生:

> npx tsc ./index.ts --target es5

产量:

index.ts:1:40 - error TS2339: Property 'values' does not exist on type 'ObjectConstructor'.

1 export const f = (x: Object) => Object.values(x);
                                         ~~~~~~
Found 1 error.

问题

安装 jest (npm install jest --save-dev) 后,同样的 typescript 命令运行没有任何问题:

# after installing jest
> npx tsc ./index.ts --target es5

没有错误。

如何将 jest 与 typescript 结合使用,并获得关于 Object.values 的准确警告?

【问题讨论】:

  • 这能回答你的问题吗? Using jest with typescript and target es5
  • @jonrsharpe 这也是我的问题,和这个基本一样。 SO将该问题与另一个问题相关联,并告诉我“您的帖子已与类似问题相关联。如果此问题无法解决您的问题,请提出新问题。” ...所以我提出了一个新问题(在链接之后)。我实际上并没有意识到任何人都可以看到这个问题。我对链接有点困惑。 (编辑:我已经删除了那个问题。)
  • 需要明确的是,stackoverflow.com/questions/42966362/… 绝对不会回答这个问题。那个是关于如何使用object.values,这个是关于让错误错误消失的玩笑。

标签: typescript jestjs


【解决方案1】:

target 表示将句法特征转译到指定目标,并不意味着不能使用可填充的特征,尽管它默认为 es5 目标的 ES5 类型,没有 lib 配置选项:

注意:如果未指定 --lib,则会注入默认的库列表。注入的默认库是:

► 对于 --target ES5:DOM,ES5,ScriptHost

► 对于 --target ES6:DOM,ES6,DOM.Iterable,ScriptHost

由于 Jest 应该在 Node 环境中运行,jest 包中包含 @types/node,它可以使用 ES6+ 库。

解决方案是不依赖默认的 TypeScript 配置并明确指定所有相关选项。生产和测试应该有单独的 TypeScript 配置。为了使 TypeScript 不会自动选择可能不属于当前环境的 @types 类型,需要明确指定 types 选项。

【讨论】:

    【解决方案2】:

    此设置适合我:

    添加类型信息:

    npm i @types/jest @types/node
    
    

    添加 jest 和 typescript 支持:

    npm i -D jest ts-jest typescript
    

    生成默认的笑话配置:

    jest --init
    

    像这样设置 jest.config.js config tranformrm 选项:

      "transform": {
        "^.+\\.(ts|tsx)$": "ts-jest"
      },
    

    添加要测试的测试过程(sum.ts):

    export default function sum(a: number, b: number): number {
      return a + b
    }
    

    添加测试(sum.test.ts):

    test('adds 1 + 2 to equal 3', () => {
      expect(sum(1, 2)).toBe(3)
    })
    

    像这样修改 package.json "scripts" 选项:

    "scripts": {
      "test": "jest",
    }
    

    运行 npm run test

    【讨论】:

    • 我刚试过这个; npx tsc ./index.ts --target es5 仍然不尊重 --target es5。例如,使用 Object.values 或 Object.entries 应该会引发打字稿错误,但不会。
    猜你喜欢
    • 2019-02-06
    • 2021-01-09
    • 2021-10-26
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 2021-12-09
    • 1970-01-01
    相关资源
    最近更新 更多