Jos*_*z_2 12 hash enums typescript
我正在使用TypeScript 制作RAM机器模拟器,因此我制作了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.
}
Run Code Online (Sandbox Code Playgroud)
我必须确保每条指令都有一个有效的操作数类型.我定义有效操作数的方法是这样的:
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],
}
Run Code Online (Sandbox Code Playgroud)
但我发现,打字稿"编译"不关心我把钥匙values--我可以改变LOAD:
到LOADXYZ:
也不会眨一下眼睛.
此外,当我尝试将其更改为:
var valid_operands = {
InsType.LOAD: [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT],
...
Run Code Online (Sandbox Code Playgroud)
它警告':' expected at line XX col YY
(那些是位置.
).我正在使用Atom TypeScript插件工作,如果有帮助的话.任何帮助表示赞赏.
小智 13
您可以使用:key in Enum
export let MyHashMap: { [key in KeyType]: IMyObject }
Run Code Online (Sandbox Code Playgroud)
苏:
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 });
Run Code Online (Sandbox Code Playgroud)
Sac*_*aka 11
在里面定义对象键 []
var valid_operands = {
[InsType.LOAD]: [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT],
[InsType.STORE]: [ OpType.NUM_DIRECT, OpType.NUM_INDIRECT],
Run Code Online (Sandbox Code Playgroud)
....
我解决它的方法是分别分配每个密钥对值.
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]
Run Code Online (Sandbox Code Playgroud)
它工作正常.但是如果有人找到了用枚举键声明哈希的方法,请继续并发布答案.:)
你可以使用Map.
enum InsType {
LOAD,
STORE
}
enum OpType {
NUM_LITERAL
}
var vo2 = new Map<InsType, [OpType]>();
vo2.set(InsType.LOAD, [OpType.NUM_LITERAL]);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6877 次 |
最近记录: |