我尝试从Map
词典创建string,function
对象。
const entityTagDictionnary = [
['GRAPH_ADD_PROPERTY_SUBTYPE', (entity) => {
console.log('addSubtype called!');
return entity;
}],
['GRAPH_IGNORE_PROPERTY_SENTENCE', (entity) => {
console.log('ignore property called!');
return entity;
}],
['GRAPH_FORMAT_DATES', (entity) => {
console.log('formatDates called!');
return entity;
}],
];
const entityMap : Map<string, Function> = new Map(entityTagDictionnary);
我收到了以下错误:
Argument of type '(string | ((entity: any) => any))[][]' isn't matching the argument 'Iterable<[string, Function]>'.
我做错了吗?
答案 0 :(得分:3)
问题是要映射的构造函数采用元组数组并根据元组类型推断类型。此构造函数的签名是:
padding: 10px 0
你的数组的问题是它不是一个元组数组,它是一个数组数组,内部数组的项是new <K, V>(entries?: ReadonlyArray<[K, V]>): Map<K, V>;
。除非需要这样做,否则Typescript不会基于数组文字推断元组类型。简单的解决方案是将数组文字放在构造函数参数中:
string | ((e: any) => any)
或使用显式类型注释:
const entityMap: Map<string, Function> = new Map([
['GRAPH_ADD_PROPERTY_SUBTYPE', (entity: any) => {
console.log('addSubtype called!');
return entity;
}],
['GRAPH_IGNORE_PROPERTY_SENTENCE', (entity: any) => {
console.log('ignore property called!');
return entity;
}],
['GRAPH_FORMAT_DATES', (entity: any) => {
console.log('formatDates called!');
return entity;
}],
]);
或者你可以使用元组助手函数强制打字脚本来推断元组类型,如here所述
const entityTagDictionnary: Array<[string, (e: any)=> any]> = [...]
答案 1 :(得分:0)
您可以尝试以下解决方法
const entityTagDictionnary: {[key:string]:Function} = {
GRAPH_ADD_PROPERTY_SUBTYPE: (entity)=>{
console.log('addSubtype called!');
return entity;
},
...
}
然后您根本不需要使用new Map()
来电,您可以通过运行entityTagDictionnary['GRAPH_ADD_PROPERTY_SUBTYPE']('my entity')
来测试它;