Ошибка выполнения Typescript: невозможно прочитать свойство undefined (enum) - PullRequest
0 голосов
/ 16 мая 2018

У меня есть следующий интерфейс и перечисление в файле RESTConfig.ts :

export const enum RESTMethod {
   POST = "POST",
   GET = "GET"
}

export interface RESTConfig {
   url: string;
   method: RESTMethod;
   data: any;
}

Я хочу импортировать и использовать перечисление в другом классе как таковое:

import { RESTConfig, RESTMethod } from './RESTConfig';

class Pipelines {
   ...
   private someMethod() {
      let rest: RESTConfig = {
         url: "",
         method: RESTMethod.POST,
         data: {}
      }
      ...

   }
   ...
}

Линирование и перенос работает нормально, но во время выполнения я получаю следующую ошибку:

TypeError: Невозможно прочитать свойство 'POST' из неопределенного

настрока "method: RESTMethod.POST".

Может кто-нибудь сказать мне, что я делаю неправильно?

1 Ответ

0 голосов
/ 09 ноября 2018

В Typescript есть 2 вида перечислений:

  • Классический enum:

Во время переноса TS в JS они преобразуются в реальные объекты, поэтому они существуют во время выполнения.

enum Response {
    No = 0,
    Yes = 1,
}

const yes = Response.Yes; // Works at runtime

const nameOfYes = Response[yes]; // Also works at runtime because a reverse mapping is also generated during transpilation
  • const enum (тот, который вы используете):

Константные перечисления удаляются во время переноса в JS, поэтому вы не можете использовать их во время выполнения. Согласно TS doc константные перечисления существуют до , избегая оплаты стоимости дополнительного сгенерированного кода и дополнительной косвенности при доступе к значениям перечисления .

const enum Response {
    No = 0,
    Yes = 1,
}

const yes = Response.Yes; // At runtime: ReferenceError: Response is not defined

const nameOfYes = Response[yes]; // During transpilation: TS2476: A const enum member can only be accessed using a string literal.

Так что просто измените ваш const enum на enum, и ваша ошибка во время выполнения исчезнет.

...