microsoft / microsoft/TypeScript

Unable to return ElementFinder from an async function in TS 3.9

オープン
#41,159 コメント 5 件 リアクション 7 件 担当者 1 名 GitHub で見る

@rbuckton がすでに取り組んでいます。

2020年10月19日 から。

Needs Investigation
主要言語
Go
スター
111k
フォーク
14.3k
平均マージ
2日 4時間
マージ済み PR(30日)
132

説明

TypeScript Version: 3.9.2

Search Terms:
The return type of an async function must either be a valid promise or must not contain a callable 'then' member.(1058)

Code

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

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<ElementFinder> {

    //await something up here so require async function

    return array.first() as any;
}

This code works in 3.8.

Expected behavior:
We should be able to compile the above code or at least tell TS to ignore the error and compile anyway.

Actual behavior:
There is no way that I could find to return an object with a then function from an async function.

Playground Link:
https://www.typescriptlang.org/play?ts=3.9.2#code/KYDwDg9gTgLgBAE2AYwDYEMrDm9BnPOAUVWAFtgA7GAMQEtKko4BvAKDk7hgAsqB+AFxwAFADNKwkQDd0qAK7Bh6SgE8AlHAC8APjgrVAGjjAoUaDUpDRp81GVrNu-Y+16ACubJ08wADwGOgDcbAC+bGygkLCIKBhYOBgExKQU1ACCZuiq7FxwYnRQeDAi6sIk5FS0DEwh4ZHg0PD4qpTI+fJtMHQQlPoEpjAAygwA5qQVaSUcXJhQ2eWpVZnzRmxlcJ4Q3r5+k1X0jKZ67DOcAPTn6ADu6HTweNvAvGNw8mBwfAmPcFgAjvJCtgWm0Ol0epQInksDB5FA+nNsgA6ApFEqafAuVR1IA

This is ultimately an issue with Protractor. The "workaround" is to edit the d.ts files in node_modules which for most build chains is not an option at all. Related issue:
https://github.com/angular/protractor/issues/3831

In the above function I am trying to return an ElementFinder object from an async function. ElementFinder is a badly typed Promise type thing but I don't want the ElementFinder to be resolved, I want an unresolved ElementFinder to be returned and to be used in the calling function. It seems that the then function is breaking TS and there doesn't seem to be any way to trick TS into allowing this.
This worked fine in 3.8 but breaks in 3.9 and currently preventing us from upgrading to Angular 10.

How to I trick TS into allowing this?

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

評価

この issue はまだ評価されていません。

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。