【问题标题】:Create Map object with functions as values创建以函数为值的 Map 对象
【发布时间】:2018-05-03 18:59:34
【问题描述】:

我正在尝试从 string,function 字典创建 Map 对象。

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]>'.

我做错了什么吗?

【问题讨论】:

    标签: javascript typescript


    【解决方案1】:

    问题在于映射的构造函数采用元组数组并根据元组类型推断类型。此构造函数的签名是:

    new <K, V>(entries?: ReadonlyArray<[K, V]>): Map<K, V>;
    

    您的数组的问题在于它不是元组数组,而是数组数组,内部数组的一项是string | ((e: any) =&gt; any)。 Typescript 不会根据数组文字推断元组类型,除非需要这样做。简单的解决方案是将数组字面量放在构造函数参数中:

    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;
        }],
    ]);
    

    或者使用显式类型注解:

    const entityTagDictionnary: Array<[string, (e: any)=> any]> = [...]
    

    或者您可以使用元组辅助函数强制打字稿推断元组类型,如 here 所述

    function tupleArray<T1, T2, T3>(arr:[T1, T2, T3][]) : typeof arr 
    function tupleArray<T1, T2>(arr:[T1, T2][]) : typeof arr 
    function tupleArray<T1>(arr:[T1][]) : typeof arr 
    function tupleArray(arr:any[]) : any[]{
        return arr;
    }
    const entityTagDictionnary = tupleArray([
    ]);
    

    【讨论】:

      【解决方案2】:

      您可以尝试以下解决方法

      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')来测试它;

      【讨论】:

      • 常见情况的合理解决方法,但Map 和使用对象之间存在差异:stackoverflow.com/questions/18541940/…
      • 感谢您的评论以及指向Map 和javascript 对象之间区别的链接。
      猜你喜欢
      • 2013-04-22
      • 2019-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多