Подтвердить что ты не робот

Тип перечисления, не определенный во время выполнения

У меня проблема, когда компилятор TypScript успешно компилирует мой код, но среда выполнения дает мне неопределенные ошибки типа.

В моем приложении я создал файл types.ts с некоторыми вещами, разделяемыми между несколькими другими ts файлами. Он содержит перечисление строк, например:

enum MyEnum {
  One = "one";
  Two = "two";
}

Когда я это определяю. Компилятор позволяет мне использовать его в других ts файлах и, кажется, счастлив. Однако во время выполнения я получаю сообщение об ошибке "MyEnum не определен".

Я знаю два способа решить это:

  1. Определите перечисление в файле, где он используется. Но я не думаю, что это решит что-нибудь для других файлов, которые хотят его использовать.
  2. Используйте "export" в файле types.ts и импортируйте каждый тип явно везде, где он используется.

Я совершенно новичок в машинописном машиностроении, и я чувствую, что могу быть недопониманием чего-то фундаментального.

Во-первых, я не понимаю, почему компилятор TypScript с радостью компилирует мой код, если будет ошибка времени выполнения. Я бы понял это, если бы я использовал ключевое слово declare, сообщив компилятору, что что-то должно быть доступно во время выполнения, но в этом случае я не понимаю, почему он должен предположить, что перечисление происходит из где-либо еще, а затем файла types.ts.

Во-вторых, я хотел бы определять типы где-то глобально в моем приложении и иметь их везде, без необходимости импортировать их каждый раз, когда я их использую. Как это сделать? Или это может считаться плохой практикой?

Я использую TypScript 2.6, и моя конфигурация выглядит так:

{
  "compilerOptions": {
    /* Basic Options */
    "target": "es6",
    "module": "commonjs",
    "lib": ["es6", "es7", "esnext"],

    "sourceMap": true /* Generates corresponding '.map' file. */,
    "outDir": "build" /* Redirect output structure to the directory. */,
    "removeComments": true /* Do not emit comments to output. */,

    /* Strict Type-Checking Options */
    "strict": true /* Enable all strict type-checking options. */,

    /* Additional Checks */
    "noUnusedLocals": true /* Report errors on unused locals. */,
    "noUnusedParameters": true /* Report errors on unused parameters. */,
    "noImplicitReturns": true /* Report error when not all code paths in function return a value. */,
    "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */,

    "plugins": [{ "name": "tslint-language-service" }],
    "skipLibCheck": true // because firebase-sdk has wrong type files now (Nov 18)
  },
  "include": ["src/**/*"],
  "exclude": ["build"]
}
4b9b3361

Ответ 1

Иначе вы можете это сделать. Если вы не хотите экспортировать перечисление, вы можете определить его как const enum

const enum MyEnum {
   One = "one";
   Two = "two";
}

Они встроены в компилятор и полностью удаляются во время компиляции.

Ответ 2

У меня была такая же проблема при импорте повторно экспортированного перечисления. Это вызвало ошибку времени выполнения.

layout.ts

export enum Part { Column, Row }

index.ts

export * from './layout'

component.ts

import { Part  } from '../entities' // This causes error
import { Part } from '../entities/layout' // This works

Ответ 3

В моем случае с undefined перечислением, это оказалось из-за циклического импорта:

export enum A {...} определенное в файле a.ts, export const b =... определенное в файле b.ts;

import {A} from './a.ts' в b.ts, а import {b} from './b.ts' в a.ts

Ошибка исчезла после удаления циклического импорта.

Ответ 4

У меня была эта ошибка, и она ушла, как только я использовал ключевое слово export, т.е.

export enum MyEnum {
  One = "one";
  Two = "two";
}

И убедитесь, что вы импортируете его в файлы, в которых вы его используете, т.е.

import { MyEnum } from '../types.ts';

Я обнаружил, что когда я объявлял перечисление без ключевого слова export, я все равно мог ссылаться на перечисление, не импортируя его в другие файлы без ошибки компилятора - только во время выполнения было выбрано неопределенное исключение.

Ответ 5

Вот мой случай, когда я добавляю новый enum в файл enum.ts следующим образом:

enum.ts:

enum RotateMode {
  UNKNOWN = 'UNKNOWN',
  OPTIMIZE = 'OPTIMIZE',
  ROTATE_FOREVER = 'ROTATE_FOREVER'
}

export { RotateMode };

Я не запускал tsc чтобы скомпилировать этот файл снова. Это приводит к enum.js файле RotateMode перечисления RotateMode

enum.js:

// old file doesn't have the RotateMode enum

Затем я импортирую перечисление RotateMode в мой файл index.ts:

import { RotateMode } from './enum';

console.log('RotateMode: ${JSON.stringify(RotateMode)}');

Результат:

RotateMode: undefined

Итак, не забудьте скомпилировать файл ts после добавления чего-то нового

Ответ 6

    export enum Expertlavel {
      Beginner = 0,
Intermediate = 10,
Expert = 20

};

--Exporting все перечисления

 export * from "../Enums/enums";