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>;
从 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>;