Как использовать enum как тип ключа индекса в машинописи? - PullRequest
0 голосов
/ 08 октября 2018

Рассмотрим следующий пример.

enum DialogType {
    Options,
    Help
}

class Dialog { 
    test() : string {
        return "";
    }
}

class Greeter {

    openDialogs: { [key in DialogType]: Dialog | undefined } = {
        0: undefined,
        1: undefined
    };

    getDialog(t: DialogType) {
        return this.openDialogs[t];
    }
}

const greeter = new Greeter();
const d = greeter.getDialog(DialogType.Help);
if (d) document.write(d.test());

Также на игровой площадке

С ним 3 вопроса / вопроса:

  1. ПочемуЯ не могу опустить свойства в моем литерале инициализатора, даже если я объявляю свойства как '|undefined '
  2. Почему я не могу использовать DialogType.Options в качестве клавиши типа, и вместо этого приходится использовать жестко закодированный номер?
  3. Почему я должен использовать ключ в DialogType вместоключ: DialogType '?(Или я могу?)

1 Ответ

0 голосов
/ 08 октября 2018
  1. |undefined не делает свойство необязательным, просто означает, что оно может быть undefined, есть предложение сделать |undefined элементы необязательными, но в настоящее время оно не реализовано.Вам нужно использовать ? после ], чтобы сделать все свойства необязательными

    { [key in DialogType]?: Dialog }
    
  2. Вы можете использовать значения перечисления диалога в качестве ключей, но они должны быть вычисляемыми свойствами:

    let openDialogs: { [key in DialogType]?: Dialog } = {
        [DialogType.Options]: undefined,
    };
    
  3. { [key: number or string]: Dialog } - подпись индекса.Подписи индекса ограничены только number или string в качестве типа ключа (даже объединение двух не будет работать).Поэтому, если вы используете индексную подпись, вы можете индексировать любым number или string (мы не можем ограничиться только DialogType ключами).Концепция, которую вы здесь используете, называется отображенными типами.Сопоставленные типы в основном генерируют новый тип на основе объединения ключей (в данном случае членов перечисления DialogType) и набора правил сопоставления.Тип, который мы создали выше, в основном эквивалентен:

    let o: { [DialogType.Help]?: Dialog; [DialogType.Options]?: Dialog; }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...