typescript - 正确键入 Array.flat(Infinity)
问题描述
我了解了这种新Array.flat
方法,并认为我会用它来尝试它,但返回的类型不是我们想要的。
const hello = [1, 2, [3], [[4]]]
const x = hello.flat(Infinity)
这将x
's 的类型设置为:
const x: (number | number[] | number[][])[]
我怎样才能拥有它number[]
呢?
解决方案
我猜你一定是在使用带有新类型Array.flat()
的 TypeScript 3.9 测试版。这里的主要问题是 TypeScript 目前没有对应的数字文字类型Infinity
(请参阅microsoft/TypeScript#32277
以获取添加此内容的开放建议)。
现在,Infinity
TypeScript 中的类型只是number
. 所以编译器不知道array.flat(Infinity)
会返回最平坦的数组;相反,它会将其视为您已调用array.flat(num)
where num
is 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[]
好的,希望有帮助;祝你好运!
推荐阅读
- reactjs - 用户停止输入时的搜索仅在第一次有效(React)
- java - 安卓 | 可以在列表中创建一个点彩球吗?
- python - 在尝试量化张量流模型时,“EndVector() 需要 1 个位置参数,但给出了 2 个”
- html - 在单行而不是多行上显示文本
- powershell - wmic 与 powershell 顺序的子命令。(“wmic”然后是下一行“csproduct”)。子命令“csproduct”未执行
- azure - 具有多个站点的应用程序网关的 Azure 流量管理器自定义标头设置
- mysql - MySQL中多次执行sql查询,类似于TSQL(SQL Server)中的GO
- sql - impala shell 输出带有附件的 csv 文件生成
- django - 在 django + vue 应用程序中使用 axios 时出错
- java - Gradle Kotlin DSL:找不到或加载主类