【发布时间】:2021-06-17 04:44:44
【问题描述】:
我想在 Map 构造函数中使用(K | V)[][] 作为ReadonlyArray<[K, V]>。假设我们的 V 是一个接口IItem,K 是一个基本的number。
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]));
默认情况下,typescript 会将项目的类型视为: (number | IItem)[][]。这将不起作用并引发错误:
'(number | { key: number; val: string; })[][]' 类型的参数不可分配给'ReadonlyArray' 类型的参数。
类型 '(number | { key: number; val: string; })[]' 缺少来自类型 '[{}, {}]' 的以下属性:0, 1
幸运的是,我们可以强制类型为 Array<[number, IItem]> 以取悦 Map。
const items2 : Array<[number, IItem]> = [[1, {key: 1, val: "a"}]]
const ze_map2 = new Map<number, IItem>(items2);
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]));
这不起作用,因为这里的(number | { key: number; val: string; })[][] 不是Array<[number, IItem]>。那么,如何在 Map 中使用(K | V)[][] 作为ReadonlyArray<[K, V]>?
你可以尝试所有代码online
我阅读了How to define Map with correlation between a key type and a value type, while they both are unions 和Typescript Map<enum, set<enum>> "No overload matches this call", but I don't get why? 都没有找到解决方案。我可能错过了解决方案。
我还阅读了MDN entry on Map,它说它应该可以按预期工作,如果您在 vanilla JS 中尝试,它确实可以按预期工作:
var arr = [
{ key: 3, val: 'bar' },
{ key: 5, val: 'world' }
];
var result = arr.map(i => [i.key, i]);
const ze_map = new Map(result);
console.log(JSON.stringify([...ze_map]));
【问题讨论】:
标签: javascript typescript dictionary