typescript - 使 array.map 返回特定的类型签名
问题描述
考虑typescript中的这两个简单函数:
function produce(): Array<[number, number]> {
return [[0, 1], [2, 3]];
}
function transform(input: Array<[number, number]>): Array<[number, number]> {
return input.map(xy => [xy[0] + 1, xy[1] + 1]);
}
console.log(transform(produce()));
transform
将一个完全相同的二维整数数组数组映射到另一个数组。TypeScript 编译器说:
Type 'number[]' is not assignable to type '[number, number]'.
Property '0' is missing in type 'number[]'.
我是否必须将函数的签名更改为number[][]
(因此意外打开一个或多维数组的大门)或使用接口,或者我可以以某种方式将映射函数的返回类型定义为精确Array<[number, number]>
?
Edit1:感谢@Titian Cernicova-Dragomir,我发现,当前的 Typescript 实际上并没有显示该错误 - 但 3.1.1。做。
解决方案
自 3.1 以来,这种情况下的推理似乎有所改进。最简单的解决方案是明确返回类型:
function produce(): Array<[number, number]> {
return [[0, 1], [2, 3]];
}
function transform(input: Array<[number, number]>): Array<[number, number]> {
return input.map((xy): [number, number] => [xy[0] + 1, xy[1] + 1]);
}
console.log(transform(produce()));
推荐阅读
- cassandra - Cassandra 备份和恢复一致性
- json - 像 xslt / saxon 一样简单的 json 转换
- powershell - 使用 FILTER 与数组的任何成员进行比较
- wpf - 导航栏使用 WPF 错误(无法解析属性路径中的所有属性引用)
- android - 从 App-Widget 打开 Activity,打开最后一个 Activity
- rest - 如何实现 REST API 调用跟踪
- vue.js - Vagrant VirtualBox 本地开发环境、Ubuntu、Yarn、Vue CLI 3 - 问题
- android - 如果片段不是空的,如何加载片段 - Android?
- firebird - 如何将 Firebird 数据库与 Knime 连接?
- php - 如何在实时搜索栏中创建可点击的搜索结果