microsoft / microsoft/TypeScript
Callback argument type not inferred for union of interfaces
まだ誰も着手していません。
- 主要言語
- Go
- スター
- 111k
- フォーク
- 14.4k
- 平均マージ
- 1日 19時間
- マージ済み PR(30日)
- 117
説明
🔎 Search Terms
"implicitly has an" inference
🕗 Version & Regression Information
- This is the behavior in every version I tried, and I reviewed the FAQ for entries about "inference"
⏯ Playground Link
💻 Code
export interface AsyncResultCallback<T, E = Error> {
(err?: E | null, result?: T): void;
}
export interface AsyncResultIterator<T, R, E = Error> {
(item: T, callback: AsyncResultCallback<R, E>): void;
}
export interface AsyncResultIteratorPromise<T, R> {
(item: T): Promise<R>;
}
declare function mapLimit<T, R, E = Error>(
arr: T[],
limit: number,
iterator: AsyncResultIteratorPromise<T, R> | AsyncResultIterator<T, R, E>,
): Promise<R[]>;
mapLimit([1,2,3], 3, async (n) => {
return n ** 2;
});
🙁 Actual behavior
The type of n in the mapLimit callback is inferred as any:
Parameter 'n' implicitly has an 'any' type. (7006)
🙂 Expected behavior
I would expect the type of n to be inferred as number.
Additional information about the issue
This example is based on the types for the async package:
Note that if the type for iterator in mapLimit is changed to either just AsyncResultIteratorPromise<T, R> or just AsyncResultIterator<T, R, E> (that is, no longer a union type), things work as expected and n has type number.
I found a very old discussion of what looks to be the same issue in the DefinitelyTyped repo: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/24297. The issue described there is exactly the one I'm facing. One commenter claimed that things worked correctly, and another commenter claimed that changing the way that async was imported had some effect? Neither of those sounds plausible to me.
I found some issues that may describe the same or a similar problem:
- https://github.com/microsoft/TypeScript/issues/56881
- https://github.com/microsoft/TypeScript/issues/55632
- https://github.com/microsoft/TypeScript/issues/52047
- https://github.com/microsoft/TypeScript/issues/47599
However, my knowledge of TypeScript internals/terminology isn't strong enough to say for sure that this isn't a novel issue I'm facing. If this is in fact a duplicate, please close it as such and I'll add this example to the relevant issue. Thank you!
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
リンクされた Playground と最小限の mapLimit の例から始め、iterator が各インターフェース単体の場合と、それらのユニオンの場合で推論を比較します。関連する TypeScript の issue と、リンクされた async の型定義を確認して、対応するコンテキストを把握します。ユニオンの場合に、コールバックパラメーター n が implicit-any エラーなしで number として推論されれば完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- typescript
- 領域
- compilers
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 35/100