【问题标题】:Using 'ESNext' as a TypeScript lib option screws up the react testing library 'screen' types使用“ESNext”作为 TypeScript 库选项搞砸了反应测试库“屏幕”类型
【发布时间】:2021-03-21 13:59:39
【问题描述】:

这似乎是一个非常晦涩难懂的错误,但不确定我会在哪里寻找它。

Repro for this here.

我有一个看起来像传统的 React+RTL+TypeScript+Jest 设置。

但是,如果我在 tsconfig.jsonlib 选项中使用 ESNext,则会收到此错误(仅在 VSCode 中,测试仍然可以正常运行)。

userEvent.click(screen.getByText('aaaa'));
Argument of type '"aaaa"' is not assignable to parameter of type 'SelectorMatcherOptions | undefined'.ts(2345)

如果我从 lib 文件夹中删除 ESnext,然后重新启动,那么它可以正常工作。

这是一个错误,在这种情况下是哪个 Github 问题跟踪它? (这是 TypeScript 还是 VSCode 的问题?)

否则,为什么会发生,我该如何解决?

【问题讨论】:

    标签: typescript visual-studio-code react-testing-library


    【解决方案1】:

    这是一个非常有趣的问题。据我了解,问题不在于esnext lib。真正的问题是缺少 DOM 库。

    如果您深入查看screen 方法的定义,您会看到每个方法的定义如下:

    export type BoundFunction<T> = T extends (
        attribute: string,
        element: HTMLElement,
        text: infer P,
        options: infer Q,
    ) => infer R
        ? (text: P, options?: Q) => R
        : T extends (a1: any, text: infer P, options: infer Q, waitForElementOptions: infer W) => infer R
        ? (text: P, options?: Q, waitForElementOptions?: W) => R
        : T extends (a1: any, text: infer P, options: infer Q) => infer R
        ? (text: P, options?: Q) => R
        : never;
    
    • 如果没有DOMtsc 将推断出第一个结果(text: P, options?: Q) =&gt; R,因为它看起来不知道HTMLElement 是什么。

    • 如果有DOMtsc 将知道您的输入aaa 不是HTMLElement,因此它推断出第二个结果:(text: P, options?: Q, waitForElementOptions?: W) =&gt; R。这就是它起作用的原因。

    简而言之,只要将 DOM 指定为 lib 的一部分,它就会按预期工作:

    tsconfig.json

    {
      "lib": ["ESNext", "DOM"]
    }
    

    【讨论】:

    • 很高兴你这么认为。这是我在这里投反对票时最被冒犯的。 :D
    • 我已经能够在我的示例中重现您的解决方案。如果您将 lib 选项完全关闭,为什么会这样? Typescript 是否默认添加 DOM?
    • 这是默认的lib 地址:For --target ES5: DOM,ES5,ScriptHost, For --target ES6: DOM,ES6,DOM.Iterable,ScriptHost 。大多数情况下默认添加DOM
    • 你是怎么发现的?能发个链接吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 2013-06-16
    • 1970-01-01
    • 2018-12-05
    相关资源
    最近更新 更多