TypeScript:如何创建只读数字索引对象

TypeScript: How to create readonly numerically indexed object

在使用 WebSockets 的应用程序中,我想将套接字关闭代码映射到字符串,以便在关闭事件时,我可以从数字代码中获取消息。目前我只是从 "constants" 模块中导出一个对象,如下所示:

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

在套接字关闭时,我可以通过 CloseCodes[event.code]event.code 映射到一个字符串,这是我想要的,但我也可以做 CloseCodes[event.code] = "garbage"CloseCodes[1234]="hello"delete(CloseCodes[event.code]),所有这些都是不可取的。有没有办法为这种用法创建一个只读的数字索引结构?我正在寻找执行此操作的 TypeScript 方式,而不是 ES6 Object.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!

我相信以上述方式使用 readonly 是在 TypeScript 2.0 中引入的,因此您至少需要使用该版本的 TypeScript。另请注意,不允许删除运算符 was a very recent TypeScript change,因此您可能不会在项目中看到此行为。