gpt4 book ai didi

javascript - 无法在 Typescript 中使用 bool 值 promise 作为 thenable 构造?

转载 作者:搜寻专家 更新时间:2023-10-30 20:57:28 26 4
gpt4 key购买 nike

我正在将 Protractor 页面对象库从 JavaScript 转换为 Typescript。我有一个静态实用程序方法,它会刷新直到出现元素(或达到超时限制)。

出于某种原因,我无法使用 boolean将 promise 视为 thenable构造,我不知道为什么。错误信息是error TS2345: Argument of type '(value: boolean) => Promise<{}> | undefined' is not assignable to parameter of type '((value: boolean) => {} | IThenable<{}>) | undefined'.
Type '(value: boolean) => Promise<{}> | undefined' is not assignable to type '(value: boolean) => {} | IThenable<{}>'.
Type 'Promise<{}> | undefined' is not assignable to type '{} | IThenable<{}>'.
Type 'undefined' is not assignable to type '{} | IThenable<{}>'.

源代码如下,注释显示编译错误发生的位置。

我在要转换为 Typescript 的框架的纯 JavaScript 版本中使用了这种机制。我需要做什么才能将此方法转换为可编译的 Typescript?

import {browser, element, ElementFinder, ExpectedConditions} from 'protractor';
import * as wd from 'selenium-webdriver';
import {By} from "selenium-webdriver";

export class ExtendedExpectedConditions {

public static refreshUntilElementIsPresent(element: ElementFinder, numberOfSeconds: number = 30000,
refreshInterval: number = 5000): void {
this.refreshElement(element, numberOfSeconds, refreshInterval);
}

protected static refreshElement(element: ElementFinder, numberOfSeconds: number = 30000, refreshInterval:
number = 5000) {


//This line throws the compile error
element.isPresent().then(value => {
if (!value) {
if (numberOfSeconds <= 0) {
return new wd.promise.Promise(function (resolve, reject) {
reject('Element cannot be found after expected retry numbers');
})
}
browser.sleep(refreshInterval).then(() => {
browser.refresh().then(() => this.refreshUntilElementIsPresent(element, numberOfSeconds -
(refreshInterval / 1000)));
});
}
});
}
}

我的“package.json”如下:

{
"name": "my-project",
"version": "1.0.0",
"description": "A test suite",
"scripts": {
"tsc": "tsc",
"pretest": "npm run tsc",
"test": "node_modules/protractor/bin/protractor tmp/conf.js",
"start_selenium": "node_modules/protractor/node_modules/webdriver-manager/bin/webdriver-manager start",
"update_selenium": "node_modules/protractor/node_modules/webdriver-manager/bin/webdriver-manager update"
},
"author": aperson@someplace.com,
"dependencies": {
"@types/jasmine": "^2.5.52",
"@types/jasminewd2": "^2.0.2",
"@types/node": "^7.0.31",
"any-promise": "^1.3.0",
"jasmine-reporters": "^2.2.1",
"protractor": "^5.1.2",
"typescript": "^2.3.4"
}
}

我的 tsconfig.json 如下:

{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"moduleResolution": "node",
"sourceMap": true,
"declaration": false,
"noImplicitAny": false,
"outDir": "tmp",
"types": ["jasmine", "node"],
"strict": true
},
"exclude": [
"node_modules"
]
}

我的 conf.ts 文件如下:

import {Config, browser, protractor} from "protractor";

let testsTimeout = 3600000;
let delayBrowserTimeInSeconds = 0;

export let config: Config = {
framework: 'jasmine2',
rootElement: 'body',
seleniumServerJar:'../node_modules/protractor/node_modules/webdriver-manager/selenium/selenium-server-standalone-3.4.0.jar',
chromeDriver: '../node_modules/protractor/node_modules/webdriver-manager/selenium/chromedriver_2.30',
specs: ['tests/*Spec.js'],
capabilities: {
browserName: 'chrome',
acceptSslCerts: true,
trustAllSSLCertificates: true,
chromeOptions: {
args: ['--no-sandbox']
},
},
baseUrl: 'https://www.someurl.com',

jasmineNodeOpts: {
defaultTimeoutInterval: testsTimeout,
showColors: true,
isVerbose: true
},

onPrepare: () => {

let origFn = browser.driver.controlFlow().execute;

browser.driver.controlFlow().execute = function () {
let args = arguments;

origFn.call(browser.driver.controlFlow(), function () {
return protractor.promise.delayed(delayBrowserTimeInSeconds * 100);
});

return origFn.apply(browser.driver.controlFlow(), args);
};

setTimeout(() => {
browser.driver.executeScript<[number, number]>(() => {
return [
window.screen.availWidth,
window.screen.availHeight
];
}).then((result: [number, number]) => {
browser.driver.manage().window().setSize(result[0], result[1]);
browser.driver.manage().window().maximize();
});
});

},

getPageTimeout: 120000,
allScriptsTimeout: testsTimeout
};

最佳答案

您的真正问题似乎是类型库的作者对 then 的回调参数有一个错误的定义。方法。您在问题中略微错误地输入了错误消息,这使得更难看出发生了什么。

src/test.ts(17,34): error TS2345: Argument of type '(value: boolean) => Promise<{}> | undefined' is not assignable to parameter of type '((value: boolean) => {} | IThenable<{}>) | undefined'.
Type '(value: boolean) => Promise<{}> | undefined' is not assignable to type '(value: boolean) => {} | IThenable<{}>'.
Type 'Promise<{}> | undefined' is not assignable to type '{} | IThenable<{}>'.
Type 'undefined' is not assignable to type '{} | IThenable<{}>'.

所以你提供给.then的回调有一个类型 (value: boolean) => Promise<{}> | undefined也就是说它要么返回一个 Promise,要么返回 undefined。 .

但是.then()期待得到((value: boolean) => {} | IThenable<{}>) | undefined(这是你在问题中丢失了一个关闭的')'的地方)这就是说一个函数或没有回调。当你给它一个函数时,我们可以忽略 undefined , 所以我们必须给它一个函数来返回一些东西或一个 IThenable<something> .此代码的作者已决定在 then 中进行回调不允许返回 undefined .

所以短期修复很简单:更改您的 .then回调,所以它总是返回一个结果。

长期的解决方法是向 Selenium Webdriver 的 typescript 绑定(bind)的作者报告一个问题,并要求他们允许回调返回 {} | IThenable<{}> | undefined .

你应该会发现这段代码是为你编译的:

export class ExtendedExpectedConditions {

public static refreshUntilElementIsPresent(element: ElementFinder, numberOfSeconds: number = 30000,
refreshInterval: number = 5000): void {
this.refreshElement(element, numberOfSeconds, refreshInterval);
}

protected static refreshElement(element: ElementFinder, numberOfSeconds: number = 30000, refreshInterval:
number = 5000) {


//This line throws the compile error
element.isPresent().then(value => {
if (!value) {
if (numberOfSeconds <= 0) {
return wd.promise.rejected('Element cannot be found after expected retry numbers');
}
browser.sleep(refreshInterval).then(() => {
browser.refresh().then(() => this.refreshUntilElementIsPresent(element, numberOfSeconds -
(refreshInterval / 1000)));
});
}
return 42; // webdriver `.then` callback must return a result.
});
}
}

另外,出于某种原因,webdriver Promise 的类型定义没有声明 .resolve().reject()对象本身确实包含的方法,但您可以使用 promise.rejected()作为创建立即拒绝的 promise 的更简单方法。

关于javascript - 无法在 Typescript 中使用 bool 值 promise 作为 thenable 构造?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44655559/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com