首页 > 解决方案 > 二维数组 + 解构 = 类型错误

问题描述

有人可以在这里向我解释 TypeScript 的行为吗?

这是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)

标签: typescript

解决方案


此构造具有类型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 假定数组可以更改,因此默认情况下它使用更宽的类型。


推荐阅读