首页 > 解决方案 > 正确键入 Array.flat(Infinity)

问题描述

我了解了这种新Array.flat方法,并认为我会用它来尝试它,但返回的类型不是我们想要的。

const hello = [1, 2, [3], [[4]]]

const x = hello.flat(Infinity)

这将x's 的类型设置为:

const x: (number | number[] | number[][])[]

我怎样才能拥有它number[]呢?

标签: typescriptflatten

解决方案


我猜你一定是在使用带有新类型Array.flat()的 TypeScript 3.9 测试版。这里的主要问题是 TypeScript 目前没有对应的数字文字类型Infinity(请参阅microsoft/TypeScript#32277 以获取添加此内容的开放建议)。

现在,InfinityTypeScript 中的类型只是number. 所以编译器不知道array.flat(Infinity)会返回最平坦的数组;相反,它会将其视为您已调用array.flat(num)where numis some number-valued 表达式。这意味着它不知道最终数组的平坦程度,并最终为您提供各种可能的平坦深度的联合:

const z = [[[[[[0 as const]]]]]].flat(Infinity);
// const z: (0 | 0[] | 0[][] | 0[][][] | 0[][][][] | 0[][][][][])[]

此问题在microsoft/TypeScript#36554的评论flat()中有所说明,该问题充当目前在 TypeScript 中不能完美运行的数组方法的用例集合。如果您真的关心这一点,您可能想给它一个,以便人们知道用例正在使用中。


我暂时建议您只传递一个大的数字常量,其类型可以表示为数字文字。新的类型只能精确到大约大约的深度20,所以你不妨选择这样的东西:

const y = [[[[[[0 as const]]]]]].flat(20);
// const y: 0[]

const x = hello.flat(20); // number[]

好的,希望有帮助;祝你好运!

Playground 代码链接


推荐阅读