Typescript String Перечисление доступа - PullRequest
0 голосов
/ 13 мая 2018

Прежде всего, мне кажется, что я что-то упускаю из Typescript и Enums, хотя я все учился.

Итак, поехали:

У меня есть, скажем, следующее перечисление:

export enum LapTypes {
  'Start' = 'Start',
  'Stop' = 'Start',
  'Manual' = 'Manual',
  'manual' = 'Manual',
  'Autolap' = 'Auto lap',
  'AutoLap' = 'Auto lap',
  'autolap' = 'Auto lap',
  'Distance' = 'Distance',
  'distance' = 'Distance',
  'Location' = 'Location',
  'location' = 'Location',
  'Time' = 'Time',
  'time' = 'Time',
  'HeartRate' = 'Heart Rate',
  'position_start' = 'Position start',
  'position_lap' = 'Position lap',
  'position_waypoint' = 'Position waypoint',
  'position_marked' = 'Position marked',
  'session_end' = 'Session end',
  'fitness_equipment' = 'Fitness equipment',
}

И в моем классе я использую его как:

export class Lap  {

  public type: LapTypes;

  constructor(type: LapTypes) {
    this.type = type;
  }

}

Когда я создаю новый круг следующим образом:

const lap = new Lap(LapTypes.AutoLap);

Все хорошо.

Опять же, если я сделаю это:

const lapType = 'AutoLap';

это new Lap(LapTypes[lapType]) отлично работает

Однако, так как я хочу динамический Laptype, я пытаюсь сделать следующее:

const lapType: string = someJSON['Type'];

но когда я пытаюсь создать новый круг

new Lap(LapTypes[lapType])

Я получаю:

элемент неявно имеет тип 'any', поскольку индексное выражение не имеет типа 'number'

Я уверен, что здесь что-то не хватает, и мне нужно пересмотреть мою печатную форму.

Мне нужна помощь в том, что я делаю неправильно, и где искать, чтобы расширить свои знания.

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Поскольку имена членов перечисления являются конкретными строками, а не просто случайными строками, string не является подходящим типом для ключа перечисления.

Если someJSON.Type равно any, оно может быть:

const lapType: keyof typeof LapTypes = someJSON['Type'];
new Lap(LapTypes[lapType]);

Если someJSON.Type уже набрано как string, это может быть:

const lapType = <keyof typeof LapTypes>someJSON['Type'];
new Lap(LapTypes[lapType]);

Учитывая, что someJSON не напечатано или напечатано свободно, его следует правильно набрать как можно раньше. Тип keyof typeof LapTypes предпочтительно указывать для свойства Type в определении переменной someJSON.

0 голосов
/ 13 мая 2018

просто используйте: new Lap(LapTypes[lapType as LapTypes])

...