【问题标题】:Unable to assign value to typescript dictionary无法为打字稿字典赋值
【发布时间】:2016-09-14 09:33:11
【问题描述】:

我创建了一个打字稿字典。当我为其赋值时,出现以下错误。

         TypeError: Cannot set property 'v1/items/someItemType/someItemId/EVENT/some
    DataTypeId' of undefined
          at MainClass.subscribe (G:\Projects\src\main\MainClass
    .js:9:3522)
          at Context.<anonymous> (G:\Projects\test\main\Wish.
    spec.js:45:18)
          at callFn (G:\Projects\node_modules\mocha\lib\runna
    ble.js:315:21)
          at Hook.Runnable.run (G:\Projects\node_modules\moch
    a\lib\runnable.js:308:7)
          at next (G:\Projects\node_modules\mocha\lib\runner.
    js:298:10)
          at Immediate._onImmediate (G:\Projects\node_modules
    \mocha\lib\runner.js:320:5)

以下是我声明字典的方式。

interface StringTopicToMyTopicMap {
  [topic: string]: MyTopic;
};

下面是MyTopic的界面。

export interface MyTopic {
  dataTypeID: string;
  itemID: string;
  itemType: string;
  dataType: MyDataType;
  qos: number;
}

然后我尝试为这个字典赋值,如下所示。

private subscriptionTopicsMap: StringTopicToMyTopicMap;

subscribe(myTopic: MyTopic) {
    if (_.isEmpty(myTopic)) {
      throw new MyError('myTopic cannot be empty');
    } else {
      let topic: string;
      topic = 'v1/items/' + myTopic.itemType + '/' + myTopic.itemID + '/'
        + myTopic.dataType + '/' + myTopic.dataTypeID;
      this.subscriptionTopicsMap[topic] = myTopic;
      this.client.subscribe(topic);
    }
  }

从线路抛出错误,

this.subscriptionTopicsMap[topic] = myTopic;

我是打字稿的新手。我在这里做错了什么?请指教。

【问题讨论】:

    标签: javascript dictionary typescript typescript1.8


    【解决方案1】:

    你还没有初始化你的subscriptionTopicsMap字典, 你也没有任何实现StringTopicToMyTopicMap的类,并且可以被实例化

      class StringTopicToMyTopicMapClass implements StringTopicToMyTopicMap {
             [topic: string]: MyTopic;
      };
    
      private subscriptionTopicsMap: StringTopicToMyTopicMap = new StringTopicToMyTopicMapClass ();
    

    【讨论】:

      【解决方案2】:

      我通常以更简单的方式执行此操作,不需要第二个界面。 同样作为之前的答案,您需要={},如下所示:

      private subscriptionTopicsMap: { [id: string]: MyTopic; } = {};
      this.subscriptionTopicsMap[topic] = myTopic;
      

      【讨论】:

        【解决方案3】:

        在声明时初始化你的属性

        //private subscriptionTopicsMap: StringTopicToMyTopicMap;
        private subscriptionTopicsMap: StringTopicToMyTopicMap = {};
        

        【讨论】:

          猜你喜欢
          • 2019-05-14
          • 2022-01-27
          • 2020-07-26
          • 2016-05-14
          • 2020-07-03
          • 1970-01-01
          • 1970-01-01
          • 2019-07-09
          • 2023-03-26
          相关资源
          最近更新 更多