Javascript 如何将`(K | V)[[]`用作`ReadonlyArray<;[K,V]>;`在地图上?

Javascript 如何将`(K | V)[[]`用作`ReadonlyArray<;[K,V]>;`在地图上?,javascript,typescript,dictionary,Javascript,Typescript,Dictionary,我想在映射构造函数中使用(K | V)[]作为ReadonlyArray。假设我们的V是一个接口IItem,K是一个基本的数字 interface IItem { key: number; val: string; } const items = [[1, {key: 1, val: "a"}]] const ze_map = new Map<number, IItem>(items); console.log(JSON.stringify([

我想在映射构造函数中使用
(K | V)[]
作为
ReadonlyArray
。假设我们的V是一个接口
IItem
,K是一个基本的
数字

interface IItem {
    key: number;
    val: string;
}

const items = [[1, {key: 1, val: "a"}]] 
const ze_map = new Map<number, IItem>(items);
console.log(JSON.stringify([...ze_map]));
这项工作正如预期的那样。好吧,让我们来谈谈我的问题。如果我们不能强制输入,该怎么办

const arr = [
    { key: 3, val: 'bar' },
    { key: 5, val: 'world' }
];
const result: Array<[number, IItem]> = arr.map(i => ([i.key, i]));

const ze_map3 = new Map(result);
console.log(JSON.stringify([...ze_map]));

我觉得可能有更好的方法来实现这一点,但您可以通过在
映射
例程中强制转换类型:

const arr = [
    { key: 3, val: 'bar' },
    { key: 5, val: 'world' }
];
const result = arr.map(i => ([i.key, i] as [number, IItem])); // here come the trick
const ze_map3 = new Map(result);
console.log(JSON.stringify([...ze_map3]));
< > >代码> AS < /COD>关键字是一种类型断言,它告诉TSC将对象视为另一种类型(即,我们的代码> [k,v]< /代码>),而不是编译器推断对象的类型(即<代码>(kv v)[]/COD>)。 好消息是,
as[K,V]
在js输出中是完全透明的:

"use strict";
const arr = [
    { key: 3, val: 'bar' },
    { key: 5, val: 'world' }
];
const result = arr.map(i => [i.key, i]);
const ze_map3 = new Map(result);
console.log(JSON.stringify([...ze_map3]));


我觉得可能有更好的方法来实现这一点,但您可以通过在
映射
例程中强制转换类型:

const arr = [
    { key: 3, val: 'bar' },
    { key: 5, val: 'world' }
];
const result = arr.map(i => ([i.key, i] as [number, IItem])); // here come the trick
const ze_map3 = new Map(result);
console.log(JSON.stringify([...ze_map3]));
< > >代码> AS < /COD>关键字是一种类型断言,它告诉TSC将对象视为另一种类型(即,我们的代码> [k,v]< /代码>),而不是编译器推断对象的类型(即<代码>(kv v)[]/COD>)。 好消息是,
as[K,V]
在js输出中是完全透明的:

"use strict";
const arr = [
    { key: 3, val: 'bar' },
    { key: 5, val: 'world' }
];
const result = arr.map(i => [i.key, i]);
const ze_map3 = new Map(result);
console.log(JSON.stringify([...ze_map3]));


问题在于
.map
回调的主体。每当函数返回数组时,Typescript都会将返回类型解释为普通数组类型,而不是数组类型

避免
as
as
断言将起作用,但它可能会很危险,因为它告诉Typescript“即使它真的不是,也将此类型视为
[number,IItem]
”,而不是告诉Typescript“我希望此类型是
[number,IItem]
,所以请确保它是。”在您的情况下,
as
不是必需的,因为它实际上是类型
[number,IItem]
。我们只需要让typescript以这种方式解释它

设置泛型 最简单的方法是在
.map
函数上设置泛型类型参数。这里的泛型变量设置回调的返回类型,因此我们将其设置为
[number,IItem]

const result = arr.map<[number, IItem]>(i => [i.key, i]); // result has type [number, IItem][]

const ze_map = new Map(result); // no errors :)

问题在于
.map
回调的主体。每当函数返回数组时,Typescript都会将返回类型解释为普通数组类型,而不是数组类型

避免
as
as
断言将起作用,但它可能会很危险,因为它告诉Typescript“即使它真的不是,也将此类型视为
[number,IItem]
”,而不是告诉Typescript“我希望此类型是
[number,IItem]
,所以请确保它是。”在您的情况下,
as
不是必需的,因为它实际上是类型
[number,IItem]
。我们只需要让typescript以这种方式解释它

设置泛型 最简单的方法是在
.map
函数上设置泛型类型参数。这里的泛型变量设置回调的返回类型,因此我们将其设置为
[number,IItem]

const result = arr.map<[number, IItem]>(i => [i.key, i]); // result has type [number, IItem][]

const ze_map = new Map(result); // no errors :)