microsoft / microsoft/TypeScript
Trying to flatten an array with unknown depth causes a type error
オープン
まだ誰も着手していません。
Needs Investigation
- 主要言語
- Go
- スター
- 111k
- フォーク
- 14.4k
- 平均マージ
- 1日 19時間
- マージ済み PR(30日)
- 117
説明
Bug Report
Trying to flatten an array with unknown depth causes a type error.
🔎 Search Terms
flatInfinity
🕗 Version & Regression Information
- Errors in version 4.2.4
- This changed between versions 3.6.2 and 3.7.5 (but probably just because the type definitions aren't supported prior)
The PR https://github.com/microsoft/TypeScript/pull/32131 provides a definition for FlatArray that has this issue.
⏯ Playground Link
Playground link with relevant code
💻 Code
// first define a nested list with arbitrary depth
type Nested<T> = (T | Nested<T>)[];
const arr: Nested<number> = [1,[2,[3]]];
// locally, this bit fails for me (version 4.2.4)
//
// with an error '"recur"' is referenced directly or indirectly in its own type annotation.
const res: number[] = arr.flat(Infinity);
// you can do a quick workaround as follows:
const res2: number[] = (arr as any[]).flat(Infinity);
// but for some reason on the TypeScript playground this doesn't fail, but you can emulate it
// by using the following definition that is equivalent to the one provided in the standard library:
// https://github.com/microsoft/TypeScript/blob/d8e9f6951919a347bb155b938a5006f9efabb778/lib/lib.es2019.array.d.ts#L21
type FlatArray2<Arr, Depth extends number> = {
"done": Arr,
"recur": Arr extends ReadonlyArray<infer InnerArr>
? FlatArray2<InnerArr, [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20][Depth]>
: Arr
}[Depth extends -1 ? "done" : "recur"];
// causes a type error: '"recur"' is referenced directly or indirectly in its own type annotation.
type TestFlat<T> = FlatArray2<Nested<T>, typeof Infinity>
🙁 Actual behavior
The code errors with '"recur"' is referenced directly or indirectly in its own type annotation.
🙂 Expected behavior
The code to pass typechecking.
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
提供されたネストした配列の例でエラーを再現し、lib/lib.es2019.array.d.ts の FlatArray 定義と PR 32131 を調査する。未知の深さの flat typing で再帰的な型エラーを回避する方法を特定し、そのうえで arr.flat(Infinity) が、期待される結果の型を弱めることなく型チェックを通過することを確認する。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- typescript
- 領域
- compilers
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 35/100