TypeScript 无法在TS 3.9中的异步函数中返回ElementFinder,

mec1mxoz  于 4个月前  发布在  TypeScript
关注(0)|答案(5)|浏览(42)

TypeScript版本:3.9.2
搜索词:The return type of an async function must either be a valid promise or must not contain a callable 'then' member.(1058)
代码:

async function 

export declare class ElementFinder {
then?: (fn: (value: any) => any, errorFn?: (error: any) => any) => Promise;
}

export declare class ElementArray{
first(): ElementFinder;
}

export async function assertSingleElement( // error: The return type of an async function must either be a valid promise or must not contain a callable 'then' member.(1058)
array: ElementArray,
): Promise {

//await something up here so require async function

return array.first() as any;

}

(): Promise<{ `then`() }> {
  return {
    `then`: async () => {
      // ...
    },
  };
}

这段代码在TypeScript 3.8中可以正常工作,但在TypeScript 3.9.2中会报错。要解决这个问题,可以将返回的对象类型更改为Promise<any>,这样就可以避免类型检查错误。修改后的代码如下:

async function 

export declare class ElementFinder {
then?: (fn: (value: any) => any, errorFn?: (error: any) => any) => Promise;
}

export declare class ElementArray{
first(): ElementFinder;
}

export async function assertSingleElement( // error: The return type of an async function must either be a valid promise or must not contain a callable 'then' member.(1058)
array: ElementArray,
): Promise {

//await something up here so require async function

return array.first() as any;

}

(): Promise<any> {
  return {
    `then`: async () => {
      // ...
    },
  };
}
5lhxktic

5lhxktic1#

有趣的是,将then方法设为非可选会消 debugging 误:

export declare class ElementFinder {
    then: (fn: (value: any) => any, errorFn?: (error: any) => any) => Promise<any>;
}
yyyllmsg

yyyllmsg2#

是的,那么这个修复能否发布?

qkf9rpyu

qkf9rpyu3#

目前的一种解决方法是在返回行之前添加 //@ts-expect-error ,这将在错误消失时给你一个编译器错误,所以你需要记住更新它。

lfapxunr

lfapxunr4#

我的解决方法是声明以下替换的ElementFinder类,该类继承自protractor.ElementFinder。然后将所有对protractor.ElementFinder的引用替换为它,使用as unknown as ElementFinder对检索到的元素进行类型转换。

import { protractor } from 'protractor';

export declare class ElementFinder extends protractor.ElementFinder {
  then: (fn: (value: any) => any, errorFn?: (error: any) => any) => Promise<any>;
}

export class SomePageObject {
    // Retrieving an element...
    async manipulateSomeElement(): Promise<ElementFinder> {
        const someElement = await (protractor.element(protractor.by.css('.someClass')) as unknown as ElementFinder);
        // do something with element
        return someElement;
    }
}

这并不是很好,但似乎可以正常工作。

zdwk9cvp

zdwk9cvp5#

关于这个的更新情况如何?对于我们仍在使用Protractor的人来说,这是一个糟糕的消息。

相关问题