【问题标题】:How to define a hash with enum keys in Typescript如何在 Typescript 中使用枚举键定义散列
【发布时间】:2016-10-28 13:09:06
【问题描述】:

我正在使用 TypeScript 制作一个 RAM Machine 模拟器,因此我对 RAM 可以具有的指令类型进行了枚举:

enum InsType {
    LOAD,   // Put value from specified register (or literal) into accumulator.
    STORE,  // Store value from accumulator into specified register.
    READ,   // Read from input tape and write into specified register.
    WRITE,  // Write to output tape from specified register.
    ADD,    // Add value into accumulator.
    SUB,    // Subtract value from accumulator.
    MUL,    // Multiply accumulator by referenced (or literal) value.
    DIV,    // Divide accumulator by referenced (or literal) value.
    HALT,   // Stop program execution.
    JUMP,   // Jump unconditionally to line specified by tag.
    JZERO,  // Jump to line specified by tag if accumulator value is zero.
    JGTZ,   // Jump to line specified by tag if acc value is greater than zero.
}

我必须确保每条指令都有一个有效的操作数类型。 我定义有效操作数的方式是这样的:

var valid_operands = {
  LOAD:   [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT],
  STORE:  [                    OpType.NUM_DIRECT, OpType.NUM_INDIRECT],
  READ:   [                    OpType.NUM_DIRECT, OpType.NUM_INDIRECT],
  WRITE:  [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT],
  ADD:    [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT],
  SUB:    [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT],
  MUL:    [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT],
  DIV:    [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT],
  HALT:   [OpType.NONE],
  JUMP:   [OpType.NAME],
  JZERO:  [OpType.NAME],
  JGTZ:   [OpType.NAME],
}

但我发现 TypeScript 的“编译器”并不关心我在键值中输入的内容——我可以将 LOAD: 更改为 LOADXYZ:,而且不会让人眼前一亮。

另外,当我尝试将其更改为:

var valid_operands = {
  InsType.LOAD:   [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT],
  ...

它警告':' expected at line XX col YY(那些是.的位置)。如果有帮助,我正在使用 Atom TypeScript 插件工作。任何帮助表示赞赏。

【问题讨论】:

    标签: hash typescript enums


    【解决方案1】:

    我解决它的方法是单独分配每个密钥对值。

    var vo2 = { }
    
    vo2[InsType.LOAD]  = [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT]
    vo2[InsType.STORE] = [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT]
    vo2[InsType.READ]  = [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT]
    vo2[InsType.WRITE] = [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT]
    vo2[InsType.ADD]   = [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT]
    vo2[InsType.SUB]   = [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT]
    vo2[InsType.MUL]   = [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT]
    vo2[InsType.DIV]   = [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT]
    vo2[InsType.HALT]  = [OpType.NONE]
    vo2[InsType.JUMP]  = [OpType.NAME]
    vo2[InsType.JZERO] = [OpType.NAME]
    vo2[InsType.JGTZ]  = [OpType.NAME]
    

    它工作正常。但是,如果有人找到一种方法来声明带有枚举键的哈希,请继续并发布答案。 :)

    【讨论】:

      【解决方案2】:

      您可以使用Map

      enum InsType {
          LOAD,
          STORE
      }
      
      enum OpType {
          NUM_LITERAL
      }
      
      var vo2 = new Map<InsType, [OpType]>();
      vo2.set(InsType.LOAD, [OpType.NUM_LITERAL]);
      

      【讨论】:

      • 谢谢,这也是一个有效的答案。它与我所做的不同之处在于它强制键和值类型,因此它更适合编写强类型程序。
      • 还有严格的小问题。您可以在创建后向 Map 添加元素。
      【解决方案3】:

      []中定义对象键

      var valid_operands = {
        [InsType.LOAD]:   [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT],
        [InsType.STORE]:  [                    OpType.NUM_DIRECT, OpType.NUM_INDIRECT],
      

      ....

      【讨论】:

        【解决方案4】:

        您可以使用:key in Enum

        export let MyHashMap: { [key in KeyType]: IMyObject }
        

        太棒了:

        export enum KeyType {
            A = 'A',
            B = 'B'
        }
        
        export interface IMyObject {
            type: KeyType,
            title: string
        }
        
        export const MyObject: IMyObject[] = [
            { type: KeyType.A, title: 'my a' },
            { type: KeyType.B, title: 'my b' }
        ]
        
        //this is the code you want
        export let MyHashMap: { [key in KeyType]: IMyObject }
        
        
        MyHashMap = MyObject.reduce((map, obj) => {
            map[obj.type] = obj;
            return map;
        }, {} as { [key in KeyType]: IMyObject });
        

        【讨论】:

          猜你喜欢
          • 2020-08-09
          • 1970-01-01
          • 2023-04-04
          • 1970-01-01
          • 2019-10-19
          • 2020-09-24
          • 2019-10-18
          • 2019-10-15
          • 1970-01-01
          相关资源
          最近更新 更多