typescript - 二维数组 + 解构 = 类型错误
问题描述
有人可以在这里向我解释 TypeScript 的行为吗?
JavaScript
const test1 = [ ['a', 'b'], ['c', 'd'], ]; const test2 = [ ...[ ['a', 'b'], ['c', 'd'], ], ]; console.log(JSON.stringify(test1) === JSON.stringify(test2));
按预期记录
true
(数组相同)。打字稿
const test1: [string, string][] = [ ['a', 'b'], ['c', 'd'], ]; const test2: [string, string][] = [ ...[ ['a', 'b'], ['c', 'd'], ], ];
但是,这会导致以下错误
test2
:Type 'string[][]' is not assignable to type '[string, string][]'. Type 'string[]' is not assignable to type '[string, string]'. Target requires 2 element(s) but source may have fewer.
这是TypeScript Playground 上的复制器。
我在这里做错了什么,或者有什么方法可以让它工作而不求助于一些丑陋的类型转换?
更新
这是我要实现的目标的更具体示例:
const someValues = [1, 2, 3];
const test3: [string, string][] = [
...someValues.map(value => ['some string', 'another string']),
];
更新#2
遵循 Алексей Мартинкевич 的建议,我可以确认这可行:
const someValues = [1, 2, 3];
const test3: (readonly [string, string])[] = [
...someValues.map(i => ['a', 'a'] as const),
];
但是会有一个更易读/不太复杂的解决方案吗?
(想想我的同事和未来两周的我想知道我在那里做了什么:D)
解决方案
此构造具有类型string[][]
,因此无法分配给[string, string][]
。
...[
['a', 'b'],
['c', 'd'],
]
以下应该有效:
const test1: [string, string][] = [
['a', 'b'],
['c', 'd'],
];
const test2: [string, string][] = [
...test1,
];
您可以使用as const
,但您需要将所有内容保持为只读:
const test2: (readonly [string, string])[] = [
...[
['a', 'b'],
['c', 'd'],
] as const
]
Typescript 假定数组可以更改,因此默认情况下它使用更宽的类型。
推荐阅读
- jpa - jpa criteriabuilder 多个连接的问题
- kubernetes - Kubernetes Fluentd 多行日志
- php - 如何通过用新数据替换旧数据来更新 PHP 中的 JSON 数组
- azure - 在 Azure 中复制或导入函数应用
- javascript - iOS 12 Safari:有没有办法让基于 Web 的 QR 扫描工作?
- eclipse - 是否需要删除 Eclipse 首选项 epf 文件中存在的“/instance/”关键字来设置 Eclipse plugin_customization.ini?
- demandware - OCAPI:我的问题是,注册用户是否可以使用 OCAPI 保存以备后用或心愿单产品
- android - Android Firebase数据库自定义用户名登录不起作用
- java - 如何在 Dart 中使用 RawSocket?
- python-3.x - 在唯一编号系统中查找最高值