2017-01-22 15 views
2

В приложении, использующем WebSockets, я хочу сопоставить коды сокета-закрытия для строк, чтобы при закрытии события я мог получить сообщение из числового кода. На данный момент я просто экспортировать объект из модуля «константы», например, так:TypeScript: Как создать только что проиндексированный объектно-ориентированный объект

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

На гнездо близко, я могу сопоставить event.code в строку через CloseCodes[event.code], что это то, что я хочу, но я также могут делать CloseCodes[event.code] = "garbage", CloseCodes[1234]="hello" и delete(CloseCodes[event.code]), все из которых нежелательны. Есть ли способ создать индексированную структуру только для чтения для такого типа использования? Я ищу способ TypeScript для этого, а не путь ES6 Object.defineProperty(...).

ответ

1

Да, просто объявить его с 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 так, как показано выше, была введена в машинописном 2.0, так что вам нужно использовать, по крайней мере эту версию машинопись. Также обратите внимание, что запрет удаления оператора was a very recent TypeScript change, так что вы еще не видите этого поведения в своем проекте.

+0

спасибо, это работает. Я не получаю сообщение об ошибке с 'delete WsCloseCodes [1000];' хотя, не уверен, почему, поскольку я запускаю TypeScript 2.1.4. В любом случае, это то, что я искал. – 4EverLive