-1

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

在这里复制。

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

但是,如果我ESNextlib选项中使用tsconfig.json,则会出现此错误,(仅在 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 的问题吗?)

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

4

1 回答 1

1

这是一个非常有趣的问题。据我了解,问题不在于esnextlib。真正的问题是缺少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) => R,因为它看起来不知道是什么HTMLElement

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

简而言之,只要您将其指定DOMlibthen 的一部分,它就会按预期工作:

tsconfig.json

{
  "lib": ["ESNext", "DOM"]
}
于 2020-12-10T09:09:00.137 回答