在使用websockets的应用程序中,我想将socket关闭代码映射到字符串,这样在关闭事件时,我可以从数字代码中获取消息。目前,我只是从“常量”模块导出一个对象,如下所示:

export const CloseCodes: { [index: number]: string } = {
    1000: "Normal closure",
    1001: "The endpoint is going away",
    1002: "The endpoint is terminating"
    // etc.
}

在socket close上,我可以通过event.codeCloseCodes[event.code]映射到字符串,这是我想要的,但是我也可以执行CloseCodes[event.code] = "garbage"CloseCodes[1234]="hello"delete(CloseCodes[event.code]),所有这些都是不需要的。有没有办法为这种类型的使用创建一个只读的数字索引结构?我在找一种打字的方式来做这件事,而不是es6Object.defineProperty(...)的方式。

最佳答案

是的,简单地用readonly index signature >声明:

export const CloseCodes: { readonly [index: number]: string } = {
    1000: "Normal closure",
    1001: "The endpoint is going away",
    1002: "The endpoint is terminating"
    // etc.
}

// Both "Index signature in type '{ readonly [index: number]: string; }' only permits reading." errors:
CloseCodes[1000] = "bad";  // error!
delete CloseCodes[1000];  // error!

我相信在TypeScript2.0中引入了如上所示的方式使用readonly,所以您至少需要使用那个版本的TypeScript。还要注意,不允许delete操作符was a very recent TypeScript change,因此您可能还没有在项目中看到这种行为。

08-06 16:39