如何从键值对数组初始化 Map

Ana*_*mar 1 typescript

我有一个数组,如:

const myArray = [['key1', 'value1'], ['key2', 'value2']];
Run Code Online (Sandbox Code Playgroud)

我想从 myArray 创建 Map (在 TypeScript 中,在 JS 中工作正常)。

这不起作用:

const myMap = new Map(myArray);
Run Code Online (Sandbox Code Playgroud)

错误:

No overload matches this call.
  Overload 1 of 3, '(iterable: Iterable<readonly [unknown, unknown]>): Map<unknown, unknown>', gave the following error.
    Argument of type 'string[][]' is not assignable to parameter of type 'Iterable<readonly [unknown, unknown]>'.
...
Run Code Online (Sandbox Code Playgroud)

但是,这有效:

const myMap = new Map([['key1', 'value1'], ['key2', 'value2']]);
Run Code Online (Sandbox Code Playgroud)

Cer*_*nce 6

打字稿自动推断的类型myArray为:

string[][]
Run Code Online (Sandbox Code Playgroud)

但是 Map 构造函数接受包含正好两个项的数组的可迭代对象。

您可以定义myArrayasconst以便 TS 不会自动将类型从“2 个字符串的数组数组”扩展为“字符串数组的数组”:

const myArray = [['key1', 'value1'], ['key2', 'value2']] as const;
Run Code Online (Sandbox Code Playgroud)

另一种方式,对于不支持的旧版本 TS as const(在 3.4 中引入):

const myArray: Array<[string, string]> = [['key1', 'value1'], ['key2', 'value2']];
Run Code Online (Sandbox Code Playgroud)

或者,如果您需要完全保留键/值:

const myArray = [['key1', 'value1'] as ['key1', 'value1'], ['key2', 'value2'] as ['key2', 'value2']];
Run Code Online (Sandbox Code Playgroud)