在Typescript中,使用公用字符串字段作为键从Array <t>构造Map <string,t>时出错

时间:2018-11-04 00:03:47

标签: javascript arrays typescript dictionary

Typescript中的以下代码在最后一行给出赋值错误

interface T {id: string}
let ts: Array<T> = []
let tMap: Map<string, T> =
    new Map (
        ts.map(t => [t.id, t])
    )

在javascript环境中可以使用类似的代码。不能看到我在做什么错

2 个答案:

答案 0 :(得分:2)

问题在于Map构造函数需要一个由两个元素组成的数组tuples,但需要TypeScript does not infer tuple types from string literals。也就是说,以下内容:

const foo = [1, "two"]; 

推断为数组类型Array<string | number>,而不是元组类型[number, string]。如果您希望它是[number, string],则可以使用显式类型注释,例如

const foo: [number, string] = [1, "two"];

或类似的type assertion

const foo = [1, "two"] as [number, string];

或者,如果您非常需要此功能,因为可以将TypeScript升级到infer a tuple type from function arguments ,则可以制作这样的辅助函数:

const tuple = <T extends any[]>(...t: T) => t;

然后使用它:

const foo = tuple(1, "two"); // inferred as type [number, string]

任何一种方法都可以帮助您[t.id, t]正常运行。让我们尝试最后一个:

interface T { id: string }
let ts: Array<T> = []
let tMap: Map<string, T> =
  new Map(
    ts.map(t => tuple(t.id, t))  // okay 
  );

希望有帮助。祝你好运!

答案 1 :(得分:0)

好像Typescript不能将地图内容推断为元组,这可能应该报告为错误。但是我通过明确编写地图内容的类型找到了我认为可以接受的解决方法:

let tMap: Map<string, T> =
  new Map(ts.map<[string, T]>(t => [t.id, t]))