type ‘(v1: number, callback: Function) => Promise<void>' 不可分配给 'string | ((arguments_0: number) => void)' 类型的参数

type ‘(v1: number, callback: Function) => Promise<void>' is not assignable to parameter of type 'string | ((arguments_0: number) => void)'

从 wdio v5 更新到 wdio v6(6.11.0 带有“typescript”:“^4.2.2”)后,我开始在 browser.executeAsync(runCheck, v1)[=15 上收到以下错误=]

error TS2345: Argument of type ‘(v1: number, callback: Function) => Promise<void>' 
is not assignable to parameter of type 'string | ((arguments_0: number) => void)'.

下面是我的代码:

const runCheck = async (
  v1: number,
  callback: Function
): Promise<void> => {
...
...
...
  callback(v1);
};


const canReceive = (
  browser: WebdriverIO.BrowserObject,
): boolean => {
  const v1 = 50;
   const rate = browser.call(() =>
      browser.executeAsync(runCheck, v1)
    );
  return rate > 10; 
};


我试过修改

Promise<void> to Promise<any>

但似乎没有帮助。 任何有关如何解决此问题的观点都将受到赞赏。

提前致谢。

TLDR,我认为 wdio 6 中的打字稿类型定义是错误的。

尝试将 runCheck 键入 any 以解决该问题。

import { expect } from 'chai';
import { Browser } from 'webdriverio'

describe('WebdriverIO 6', () => {
    it("has broken typescript type definitions", () => {
        const runCheck: any = 
            async (v1: number, callback: Function): Promise<void> => {
                callback(v1);
            };


        const canReceive = 
            async (browser: WebdriverIO.BrowserObject): Promise<boolean> => {
                const v1 = 50;
                const rate = await browser.call(() => browser.executeAsync(runCheck, v1));
                return rate > 10; 
            };
    })
})

长版。

我查看了 browser.executeAsync 的文档,看起来您正在传递它应该接受的参数。

"脚本参数以函数体的形式定义要执行的脚本。将使用提供的 args 数组调用函数,并且可以按指定顺序通过参数对象访问值。最后一个参数将始终是一个回调函数,必须调用它来发出脚本已完成的信号。” https://v6.webdriver.io/docs/api/browser/executeAsync.html

在检查 executeAsync 的类型定义时,我看到了这个

        // there is no way to add callback as last parameter after `...args`.
        // https://github.com/Microsoft/TypeScript/issues/1360
        // executeAsync: <T>(script: string | ((...arguments: any[], callback: (result: T) => void) => void), ...arguments: any[]) => Promise<T>;
        /**
         * Inject a snippet of JavaScript into the page for execution in the context of the currently selected frame.
         * The executed script is assumed to be asynchronous and must signal that is done by invoking
         * the provided callback, which is always provided as the final argument to the function. The value
         * to this callback will be returned to the client.
         */
        executeAsync: <U extends any[], V extends U>(script: string | ((...arguments: V) => void), ...arguments: U) => Promise<any>;